unsupported operand type(s) for %: 'NoneType' and 'tuple'
Victor Subervi
victorsubervi at gmail.com
Mon Dec 7 09:57:17 EST 2009
On Mon, Dec 7, 2009 at 9:36 AM, Jean-Michel Pichavant <
jeanmichel at sequans.com> wrote:
> 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.
>
That was a great suggestion. I'll do my best to remember to do that from now
on to:
>>> allTrees = [{'prodCat1': {}, 'prodCat2': {}}, {'presCat1': {},
'presCat2': {}}]
>>> level = 0
>>> tree = []
>>> for aTree in allTrees:
... for name in sorted(aTree.keys()):
... tree.append("%s%s" % ("\t" * level, name))
... print aTree([name], level + 1)
...
Traceback (most recent call last):
File "<stdin>", line 4, in ?
TypeError: 'dict' object is not callable
>>>
So It would seem I need to either figure a way to coerce the dicts into
being tuples a la:
http://code.activestate.com/recipes/361668/
(which looks like a lot of work) or I need to supply tuples instead of
dicts. The dicts come from here:
cursor.execute('select category from categories%s order by Category;' %
(store[0].upper() + store[1:]))
theTree = expand(cursor.fetchall())
which is the magical code supplied by the lister that does all the heavy
lifting but that I don't understand :-}
Suggestions?
TIA,
V
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20091207/bc7fffb3/attachment-0001.html>
More information about the Python-list
mailing list