问题:制作一个装饰器,在不改变代码文件,只引入这个装饰器的情况下实现如下效果
@profiler
def akkerman(m, n):
'''
a function neen some decoration to count the calling times
'''
while(m!=0):
if(n==0):
n=1
else:
n=ack(m, n-1)
m -= 1
return n+1
akkerman(3, 2)
print(akkerman.__doc__) # OUT: a function neen some decoration to count the calling times
print(akkerman.calls) # OUT: 258
第一次解题
根据题目要求,需要保证装饰器不影响原函数的 __doc__ 描述部分,意味着需要在装饰器内使用 functools.wraps() 来包装,保证不会导致装饰器函数顶替掉原函数(因为装饰器的原理)。
def profiler(func):
func.calls = 0
@wraps(func)
def f(*args):
f.calls += 1 # 此处使用 func 会因为装饰器的原理而无法使 akkerman 函数改变 calls 属性
return func(*args)
return f
如上代码,运行结果如下