unsupported operand type(s) for %: 'NoneType' and 'tuple'

Jean-Michel Pichavant jeanmichel at sequans.com
Mon Dec 7 09:36:25 EST 2009


Victor Subervi wrote:
> On Mon, Dec 7, 2009 at 7:14 AM, Jean-Michel Pichavant 
> <jeanmichel at sequans.com <mailto:jeanmichel at sequans.com>> wrote:
>
>     Victor Subervi wrote:
>
>
>         global printTree = <function printTree>, allTrees =
>         [{'prodCat1': {}, 'prodCat2': {}}, {'presCat1': {},
>         'presCat2': {}}]
>          /var/www/html/angrynates.com/cart/catTree.py
>         <http://angrynates.com/cart/catTree.py>
>         <http://angrynates.com/cart/catTree.py> in
>         printTree(allTrees=[{'prodCat1': {}, 'prodCat2': {}},
>         {'presCat1': {}, 'presCat2': {}}], level=0)
>
>           12     for name in sorted(aTree.keys()):
>           13       print '\t' * level, name
>           14       tree.append("%s%s") % ("\t" * level, name)
>           15       printTree(aTree[name], level + 1)
>           16
>         tree = ['%s%s'], tree.append = <built-in method append of list
>         object>, level = 0, name = 'prodCat1'
>
>         TypeError: unsupported operand type(s) for %: 'NoneType' and
>         'tuple'
>              args = ("unsupported operand type(s) for %: 'NoneType'
>         and 'tuple'",)
>
>         But according to the same error, level = 0 [the NoneType, I
>         presume] and name = 'prodCat1', which is most certainly not a
>         tuple! Why the error?
>         TIA,
>         Victor
>
>
>     Come on Victor,
>
>     Given the error, you can easily see that
>
>     tree.append("%s%s") % ("\t" * level, name)
>     is involved in the error you get.
>
>     The correct thing may be
>     tree.append("%s%s" % ("\t" * level, name))
>
>     It should be easy for you to spot.
>     FYI, tree.append('%s%s') returns None, then ("\t" * level, name)
>     is the tuple applied to None through the % operator. That is why
>     you get the above error.
>
>
> You're absolutely right. This code was supplied to me by a lister. Had 
> I written it myself, I would have caught it. Reading his code, I 
> didn't. I will train myself from now on to write out the code when I 
> come across such errors in the future (and re-write my own as well) so 
> that I can spot such errors:
>
> >>> level = 0
> >>> name = 'one'
> >>> tree = []
> >>> tree.append("%s%s" % ("\t" * level, name))
> >>>
>
> However, the code threw one of those blasted HTTP 500 errors and the 
> log had this terse comment:
>
> [Mon Dec 07 06:01:23 2009] [error] [client 208.84.198.58] Premature 
> end of script headers: catTree.py
>
> Thank you. How helpful. Here's the code:
>
> def printTree(allTrees, level=0):
>   tree = []
>   for aTree in allTrees:
>     for name in sorted(aTree.keys()):
>       tree.append("%s%s" % ("\t" * level, name))
>       printTree(aTree[name], level + 1)
>
> The problem must be occurring in the last line which creates a loop 
> since printTree is called only once at the very end of the entire 
> script (where it is returned to the referrer), but it seems perfectly 
> logical to me. Please advise.
> V
Is allTrees a dict or a list ?
Did you try to define what could be a allTree value and test your code 
step by step in a python shell ?
That's what is missing in your example: an allTrees values for us to 
execute your code and check what is going wrong.

JM




More information about the Python-list mailing list