为此使用追溯模块:
>>> import traceback>>> def f(depth=0):... print depth, traceback.print_stack()... if depth < 2:... f(depth + 1)...>>> f()0 File "<stdin>", line 1, in <module> File "<stdin>", line 2, in f None1 File "<stdin>", line 1, in <module> File "<stdin>", line 4, in f File "<stdin>", line 2, in f None2 File "<stdin>", line 1, in <module> File "<stdin>", line 4, in f File "<stdin>", line 4, in f File "<stdin>", line 2, in f None
因此,如果堆栈中的任何条目指示从
f调用了代码,则该调用是(间接)递归的。该
traceback.extract_stack方法使您可以轻松访问此数据。
iflen(l[2] ...下面的示例中的语句仅计算函数名称的完全匹配数。为了使它更漂亮(感谢agf的想法),您可以将其变成装饰器:
>>> def norecurse(f):... def func(*args, **kwargs):... if len([l[2] for l in traceback.extract_stack() if l[2] == f.func_name]) > 0:... raise Exception, 'Recursed'... return f(*args, **kwargs)... return func...>>> @norecurse... def foo(depth=0):... print depth... foo(depth + 1)...>>> foo()0Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in func File "<stdin>", line 4, in foo File "<stdin>", line 5, in funcException: Recursed



