2012-09-13 15 views
8

私は再帰的に呼び出される関数を持っており、再帰の現在のレベルを知りたいと思います。以下のコードは、私がそれを計算するために使用しているメソッドを示していますが、期待される結果が得られていません。Pythonで再帰呼び出しのレベルを見つける

など。

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) 

問題:ディレクトリのパスを指定すると、ディレクトリの再帰のレベルを印刷

ディレクトリ構造は次のとおりです:システムパスのための再帰レベルを見つけるには、私のディレクトリ構造で 、私が呼び出されます関数 "reccount(Test)"(関数はMainFolderへのパスで呼び出されます)。私は各フォルダの再帰呼び出しのレベルを知りたい。あなたが見ることができるように、それはビン/共通/ docに関する結果を出力するとき、それは代わりに3を印刷し、

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 

:私は、プロシージャを呼び出すときに(ディレクトリのみ)

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

、私は次のような結果を得ます4以降のすべての結果が間違っている

+0

なぜ負の数:

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

そのように、あなたはグローバル変数を必要としませんか? – sarbjit

答えて

29
def some_method(data, level=0): 


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


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

なぜパラメータに再帰レベルを格納しないのですか?

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

Andreasの答えはOPのための明らかな選択ですが、余分なパラメータを必要としない解決策は+1です。余分なパラメータを必要とせずに再帰関数からネストされたデバッグ情報を出力するのに非常に便利です。 – Davide

+0

この関数を別の関数から呼び出すと、数値は増加しますが、再帰の深さは変わりませんが、パラメータに基づく手法ではこの欠陥はありません。 – Bob

関連する問題