2012-09-13 44 views
8

Tôi có một hàm được gọi đệ quy và tôi muốn biết mức đệ quy hiện tại. Đoạn mã dưới đây cho thấy phương pháp mà tôi đang sử dụng để tính toán nó, nhưng nó không đưa ra kết quả mong đợi.Tìm mức độ gọi đệ quy trong python

Ví dụ: : Để tìm mức đệ quy cho một đường dẫn hệ thống:

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) 

Vấn đề: Cho một đường dẫn thư mục, in mức độ đệ quy cho thư mục

mục Cấu trúc là: Trong cấu trúc thư mục của tôi, tôi sẽ gọi function "reccount (Test)" (Hàm sẽ được gọi với đường dẫn tới MainFolder). Tôi muốn biết mức độ gọi lại đệ quy cho mỗi thư mục. (Thư mục chỉ)

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

Khi tôi gọi thủ tục, tôi nhận được kết quả sau:

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 

Như bạn có thể thấy, khi in kết quả cho bin/common/doc, nó in 3 thay vì của 4 và tất cả các kết quả tiếp theo đều sai

+0

đếm Tại sao tiêu cực? – sarbjit

Trả lời

29
def some_method(data, level=0): 


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


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

Tại sao bạn không lưu trữ mức đệ quy trong tham số?

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

Bằng cách đó, bạn không cần một biến toàn cầu:

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

Mặc dù câu trả lời của Andreas là lựa chọn hiển nhiên cho OP, +1 cho giải pháp không yêu cầu tham số bổ sung. Cực kỳ hữu ích cho việc in thông tin gỡ lỗi lồng nhau từ một hàm đệ quy mà không gặp rắc rối về tham số phụ. – Davide

+0

nếu bạn gọi hàm này từ một hàm khác, các con số sẽ tăng lên, trong khi độ sâu đệ quy sẽ vẫn như cũ, và phương pháp dựa trên tham số thiếu thiếu sót này. – Bob

Các vấn đề liên quan