Not Incrementing
Victor Subervi
victorsubervi at gmail.com
Thu Dec 31 14:37:35 EST 2009
On Thu, Dec 31, 2009 at 1:01 PM, Dave Angel <davea at ieee.org> wrote:
> Victor Subervi wrote:
>
>> Hi;
>> This "pseudo-code" snippet was given to me by Dennis on this list (whose
>> last name escapes me):
>>
>> 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)
>> return tree
>>
>> The code returns all the categories ("name") just fine. It doesn't,
>> however,
>> increment level. I know from my tests that printTree is only called twice
>> (once for each store) and about half a dozen times recursively within one
>> of
>>
>>
>
> It increments just fine, but you don't use the values it then generates.
> See below.
>
> those stores. Why doesn't this increment? Full code follows.
>> TIA,
>> beno
>>
>> #!/usr/bin/python
>>
>> import sys,os
>> sys.path.append(os.getcwd())
>> import MySQLdb
>> from login import login
>> import re, string
>>
>> 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)
>> print '1'
>> return tree
>>
>>
>>
> You have to decide what printTree is intended to do. Is it printing stuff
> (which the name implies), or is it building a result list (which the return
> statement implies) ? From the rest of the code, I assume the latter. So
> give it a different name, and fix the recursion.
>
> When it recurses, it doesn't use the return value from the inner call.
> Presumably you want to "extend" the list called "tree" each time you
> recurse. At this point, you also have to decide what order the combined
> list needs to be in, but maybe you've already done that.
>
> def expand(fetched):
>> aDict = {}
>> for (name, ) in fetched:
>> aDict[name] = {}
>> return aDict
>>
>> def getChildren(levelDict, store, level = 0):
>> user, passwd, db, host = login()
>> db = MySQLdb.connect(host, user, passwd, db)
>> cursor = db.cursor()
>> MAXLEVEL = 7
>> if level > MAXLEVEL:
>> return #possibly the data has a cycle/loop
>> for name, data in levelDict.iteritems():
>> sql = '''select * from categories%s as c
>> inner join categoriesRelationships%s as r
>> on c.ID = r.Child
>> inner join categories%s as p
>> on r.Parent = p.ID
>> where p.Category = "%s"''' % (store[0].upper() + store[1:],
>> store[0].upper() + store[1:], store[0].upper() + store[1:], name)
>> cursor.execute(sql)
>> levelDict[name] = expand(cursor.fetchall())
>> # recursive call to do next level
>> getChildren(levelDict[name], level + 1)
>> # no data return as we are mutating dictionaries in place
>>
>> def catTree(allStores):
>> user, passwd, db, host = login()
>> db = MySQLdb.connect(host, user, passwd, db)
>> cursor = db.cursor()
>> finalTrees = []
>> returnFlag = ''
>> for store in allStores:
>> allTrees = []
>> sql = 'create table if not exists categories%s (ID int(3) unsigned
>> primary key auto_increment, Category varchar(40), Parent varchar(40));' %
>> (store[0].upper() + store[1:])
>> cursor.execute(sql)
>> sql = 'create table if not exists categoriesRelationships%s (ID integer
>> auto_increment primary key, Parent integer not null, foreign key (Parent)
>> references categories%s (ID), Child integer not null, foreign key (Child)
>> references categories%s (ID), check (Parent <> Child) );' %
>> (store[0].upper() + store[1:], store[0].upper() + store[1:],
>> store[0].upper() + store[1:])
>> cursor.execute(sql)
>> cursor.execute('select Category, Parent from categories%s;' %
>> (store[0].upper() + store[1:]))
>> data = cursor.fetchall()
>> cursor.execute('select Category from categories%s order by Parent, ID;'
>> % (store[0].upper() + store[1:]))
>> Categories = [itm[0] for itm in cursor] #untuple single column
>> if len(Categories) > 0:
>> cursor.execute('select Parent from categories%s order by Parent, ID;'
>> % (store[0].upper() + store[1:]))
>> Parents = [itm[0] for itm in cursor]
>> MAXLEVEL = 15
>> # get top level
>> cursor.execute('select category from categories%s order by Category;'
>> % (store[0].upper() + store[1:]))
>> theTree = expand(cursor.fetchall())
>> getChildren(theTree, store)
>> db.commit()
>> allTrees.append(theTree)
>> returnFlag = 'gotStuff'
>> else:
>> returnFlag = 'gotNoStuff'
>> finalTrees.append(printTree(allTrees))
>>
>>
> Possibly you wanted extend() here, not append. As it stands now, you get a
> list of lists.
This is in fact what I want. That shows the nesting of the categories.
>
> if returnFlag == 'gotStuff':
>> return finalTrees
>> else:
>> return ''
>>
>>
>>
>>
> Do you really mean to return a list if "gotStuff", and a string if not ?
> That puts a burden on your caller, and doesn't agree with the docstring you
> didn't write.
>
Sloppy. I'll look at it.
>
> Incidentally, good naming would help to make the code easier to debug.
> This finalTrees and trees variables don't look to me like you intended them
> to be trees at all, but lists of tab-indented data.
>
No kidding. Many people have commented on my poor choices of names. That's
one of the things on my agenda to change (with some tools that I understand
are out there) once I get this program finished and working for clients.
beno
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20091231/72f4b177/attachment-0001.html>
More information about the Python-list
mailing list