Tengo el siguiente código de recursión, en cada nodo al que llamo sql query para que los nodos pertenezcan al nodo padre.Python: Profundidad de recursión máxima excedida
aquí es el error:
Exception RuntimeError: 'maximum recursion depth exceeded' in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879768c>> ignored
RuntimeError: maximum recursion depth exceeded while calling a Python object
Exception AttributeError: "'DictCursor' object has no attribute 'connection'" in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879776c>> ignored
método que llamo para obtener resultados sql:
def returnCategoryQuery(query, variables={}):
cursor = db.cursor(cursors.DictCursor);
catResults = [];
try:
cursor.execute(query, variables);
for categoryRow in cursor.fetchall():
catResults.append(categoryRow['cl_to']);
return catResults;
except Exception, e:
traceback.print_exc();
En realidad no tiene ningún problema con el método anterior, pero de todos modos lo ponen a dar una visión general adecuada de la pregunta.
Código de recursividad:
def leaves(first, path=[]):
if first:
for elem in first:
if elem.lower() != 'someString'.lower():
if elem not in path:
queryVariable = {'title': elem}
for sublist in leaves(returnCategoryQuery(categoryQuery, variables=queryVariable)):
path.append(sublist)
yield sublist
yield elem
Llamar a la función recursiva
for key, value in idTitleDictionary.iteritems():
for startCategory in value[0]:
print startCategory + " ==== Start Category";
categoryResults = [];
try:
categoryRow = "";
baseCategoryTree[startCategory] = [];
#print categoryQuery % {'title': startCategory};
cursor.execute(categoryQuery, {'title': startCategory});
done = False;
while not done:
categoryRow = cursor.fetchone();
if not categoryRow:
done = True;
continue;
rowValue = categoryRow['cl_to'];
categoryResults.append(rowValue);
except Exception, e:
traceback.print_exc();
try:
print "Printing depth " + str(depth);
baseCategoryTree[startCategory].append(leaves(categoryResults))
except Exception, e:
traceback.print_exc();
código para imprimir el diccionario,
print "---Printing-------"
for key, value in baseCategoryTree.iteritems():
print key,
for elem in value[0]:
print elem + ',';
raw_input("Press Enter to continue...")
print
Si la recursividad es demasiado profunda que debería llegar el error cuando llamo a mi función de recursión, pero cuando obtengo este error cuando imprimo el diccionario.
Reescriba iterativamente en lugar de recursivamente. –
La verificación 'if first:' es redundante con 'para elem in first:'. Si la consulta devuelve una lista de resultados vacía, iterar sobre ella simplemente, correctamente no hará nada, como lo desee. Además, puedes crear esa lista de forma más simple con una lista de comprensión (y esos puntos y comas son innecesarios y generalmente se consideran feos :)) –
@KarlKnechtel, disculpa por los puntos y comas, ¿puedes decir que acabo de entrar en la programación de Python ... :) –