Victor Subervi wrote:
On Mon, Dec 7, 2009 at 7:14 AM, Jean-Michel Pichavant <jeanmic...@sequans.com <mailto:jeanmic...@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

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to