2012-09-13 8 views
8

Ho una funzione chiamata in modo ricorsivo e desidero conoscere il livello corrente di ricorsione. Sotto codice mostra il metodo che sto usando per calcolarlo, ma non sta dando i risultati attesi.Trovare il livello di chiamata di ricorsione in python

E.g. : Per trovare il livello di ricorsione per un percorso di 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: Dato un percorso di directory, stampare il livello di ricorsione per la directory

struttura di directory è: Nella mia struttura di directory, chiamerò function "reccount (Test)" (la funzione verrà richiamata con il percorso su MainFolder). Voglio conoscere il livello di chiamata di ricorsione per ogni cartella. (Solo directory)

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

quando chiamo la procedura, ottengo il seguente risultato:

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 

Come si può vedere, per la stampa dei risultati per bin/common/doc, stampa 3 invece di 4 e tutti i risultati successivi sono errati

+0

conteggio Perché negativo? – sarbjit

risposta

29
def some_method(data, level=0): 


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


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

Perché non si memorizza il livello di ricorsione in un parametro?

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

In questo modo, non è necessario una variabile globale:

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

Sebbene la risposta di Andreas sia la scelta ovvia per l'OP, +1 per una soluzione che non richiede il parametro extra. Estremamente utile per la stampa di informazioni di debug annidate da una funzione ricorsiva senza il fastidio del param supplementare. – Davide

+0

se si chiama questa funzione da un'altra funzione, i numeri aumenteranno, mentre la profondità della ricorsione rimarrà la stessa e l'approccio basato su parametri non presenta questo difetto. – Bob

Problemi correlati