我正在尝试编写一个装饰器,以跟踪Python中递归函数的递归深度。
例如,使用
之类的递归函数。
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
通常,要跟踪递归深度,您可以编写如下内容
def fib(n, level=0):
print(level)
if n == 0:
return 0
if n == 1:
return 1
else:
return fib(n-1, level=level+1) + fib(n-2, level=level+1)
但是,在与装饰者摆弄了一段时间并进行了很多搜索之后,我不确定这是否有可能。
我尝试过类似的事情
def visualise(func):
def modify(*args, **kwargs):
kwargs["count"] += 1
print(kwargs["count"])
return func(*args, **kwargs)
return modify
@visualise
def fib(n):
...
fib(4, count=0)
但是它抱怨count
是一个意外的关键字参数,我不太理解,因为我印象是包装器modify
替换了所有出现的fib
,但是我猜不出来?
指针将不胜感激。
答案 0 :(得分:0)
您可以为装饰器指定level变量,然后在这样的函数调用中使用它:
def visualise(func):
visualise.level = 0
def wrapper(*args, **kwargs):
print("In:", visualise.level)
visualise.level += 1
result = func(*args, **kwargs)
visualise.level -= 1
print("Out:", visualise.level)
return result
return wrapper
答案 1 :(得分:0)
您是否可以将函数定义如下?
def fib(n, count=0):
# ....
答案 2 :(得分:0)
这是 previous answer from Lev Zakharov above
的基于类的方法from functools import wraps
class Visualize(object):
def __init__(self):
self.level = 0
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
print("In:", self.level)
self.level += 1
result = func(*args, **kwargs)
self.level -= 1
print("Out:", self.level)
return result
return wrapper
@Visualize()
def fib(n):
...
关于@wraps
见here