我有关于功能装饰器的以下代码块我想在第二次调用wrapper.calls
时将变量fib()
初始化为0知道在第一次运行时它给出了正确答案,之后,它表现为对先前输出求和。我的问题是如何通过更改装饰器分析器来解决这个问题,好吗?
这是我的代码:
from functools import wraps
import time
def profiler(func):
@wraps(func)
def wrapper(*args, **kwargs):
wrapper.calls += 1
return func(*args, **kwargs)
wrapper.calls = 0
return wrapper
@profiler
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
fib(1)
print(fib.calls)
fib(2)
print(fib.calls)
执行后该程序的输出:
1
4
预期产出
1
3
因为calls = 0
只在fib = profiler(fib)
初始化。
如果你只执行
fib(2)
print(fib.calls)
它将是3
要么
for input_n in (1, 2):
fib = profiler(fib)
fib(input_n)
print(fib.calls)
将是你期望的
1
3