2012-09-13 15 views
8

Yinelemeli olarak adlandırılan bir işlev var ve mevcut yineleme düzeyini bilmek istiyorum. Aşağıdaki kod, hesaplamak için kullandığım yöntemi gösterir, ancak beklenen sonuçları vermez.Python'da yineleme çağrısı düzeyini bulma

E.g. I arayacak, benim dizin yapısında :

Dizin Yapısı olan dizinin özyineleme seviyesini yazdırmak bir dizin yolu Verilen:

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) 

Sorun: Bir sistem yolu için yineleme düzeyini bulmak için "reccount (Test)" fonksiyonu (Fonksiyon, MainFolder'a giden yol ile çağrılacaktır). Her klasör için yineleme çağrısı seviyesini bilmek istiyorum. (Rehber yalnızca)

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

i prosedürü çağırdığınızda, ben şu sonucu alırsınız: Gördüğünüz gibi

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 

, bu bin/ortak/dokümana ilişkin sonuçları yazdırır, bunun 3 yerine yazdırır 4 ve tüm takip eden sonuçlar yanlış

+0

Neden negatif miktar:

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

Bu şekilde, küresel bir değişkeni gerekmez? – sarbjit

cevap

29
def some_method(data, level=0): 


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


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

Yineleme seviyesini neden bir parametrede saklamıyorsunuz?

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

Andrea'nın cevabı, OP için açık seçenektir, ancak ekstra parametre gerektirmeyen bir çözüm için +1. Ekstra paramın zahmetine girmeden, yinelemeli bir işlevden iç içe geçmiş hata ayıklama bilgisi yazdırmak için son derece yararlıdır. – Davide

+0

Bu işlevi başka bir işlevden çağırırsanız, sayılar artacak, yineleme derinliği aynı kalacaktır ve parametre tabanlı yaklaşım bu kusurdan yoksundur. – Bob

İlgili konular