2012-09-13 12 views
8

Tengo una función que se llama recursivamente y quiero saber el nivel actual de recursión. El siguiente código muestra el método que estoy usando para calcularlo, pero no está dando los resultados esperados.Encontrar el nivel de llamada de recursión en python

E.g. : Para encontrar el nivel de recursión para una ruta del sistema:

import os 
    funccount = 0 

    def reccount(src): 
     global funccount 
     print "Function level of %s is %d" %(src, funccount) 

    def runrec(src): 
     global funccount 
     funccount = funccount + 1 
     lists = os.listdir(src) 
     if((len(lists) == 0)): 
      funccount = funccount - 1 
     reccount(src) 
     for x in lists: 
      srcname = os.path.join(src, x) 
      if((len(lists) - 1) == lists.index(x)): 
        if (not(os.path.isdir(srcname))): 
         funccount = funccount - 1 
      if os.path.isdir(srcname): 
       runrec(srcname) 

    runrec(C:\test) 

Problema: Dada una ruta de directorio, imprimir el nivel de recursividad para el directorio

estructura de directorios es: En mi estructura de directorios, voy a llamar a la función "reccount (Test)" (se llamará a la función con ruta a MainFolder). Quiero saber el nivel de llamada de recurrencia para cada carpeta. (Sólo Directorio)

Test: 
    |----------doc 
    |----------share 
       |----------doc 
          |----------file1 
    |----------bin 
       |----------common 
          |----------doc 
    |----------extras 
    |----------file2 

cuando llamo el procedimiento, me sale el siguiente resultado:

Function level of C:\test is 1 
    Function level of C:\test\bin is 2 
    Function level of C:\test\bin\common is 3 
    Function level of C:\test\bin\common\doc is 3 
    Function level of C:\test\doc is 3 
    Function level of C:\test\extras is 3 
    Function level of C:\test\share is 4 
    Function level of C:\test\share\doc is 5 

Como se puede ver, cuando imprime los resultados de bin/common/doc, imprime 3 en vez de 4 y todos los resultados posteriores son incorrectos

+0

Por qué recuento negativo? – sarbjit

Respuesta

29
def some_method(data, level=0): 


    some_method(..., level=level+1) 


if __name__ == '__main__': 
    some_method(my_data) 
3

¿Por qué no almacena el nivel de recursión en un parámetro?

def runrec(src, level=1): 
    # ... 
    runrec(new_src, level + 1) 

De esta manera, no es necesario una variable global:

def reccount(src, level): 
    print "Function count of {} is {}".format(src, level) 
16
from inspect import getouterframes, currentframe 
import os 

def runrec(src): 
    level = len(getouterframes(currentframe(1))) 
    print("Function level of {} is {}".format(src, level)) 
    for x in os.listdir(src): 
     srcname = os.path.join(src, x) 
     if os.path.isdir(srcname): 
      runrec(srcname) 

runrec('C:\\test') 

Function level of C:\test is 1 
Function level of C:\test\bin is 2 
Function level of C:\test\bin\common is 3 
Function level of C:\test\bin\common\doc is 4 
Function level of C:\test\doc is 2 
Function level of C:\test\extras is 2 
Function level of C:\test\share is 2 
Function level of C:\test\share\doc is 3 
+2

Aunque la respuesta de Andreas es la opción obvia para el OP, +1 para una solución que no requiere el parámetro adicional. Extremadamente útil para imprimir información de depuración anidada desde una función recursiva sin la molestia del parámetro extra. – Davide

+0

si llama a esta función desde otra función, los números aumentarán, mientras que la profundidad de recursión seguirá siendo la misma, y ​​el enfoque basado en parámetros carece de este defecto. – Bob

Cuestiones relacionadas