functools.wraps定义函数装饰器
def tracer(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result)) return result return wrapper@tracerdef fibonacci(n): if n in (0,1): return n return (fibonacci(n-1)+fibonacci(n-2))fibonacci(3)print(fibonacci)print('help:')help(fibonacci)
从执行结果看到:最后的函数对象,变成了wrapper,而并非fibonacci函数对象。
因fibonacchi函数在装饰器后,wrapper对象赋值给了fibonacci函数对象,即fibnacchi = wrapper。
也就是说,原函数的属性失效了
如果想要保留原函数的属性,就可以用到functools.wraps了
from functools import wrapsdef tracer(func): @wraps(func) def wrapper(*args, **kwargs): result = func(*args, **kwargs) print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result)) return result return wrapper@tracerdef fibonacci(n): if n in (0,1): return n return (fibonacci(n-1)+fibonacci(n-2))fibonacci(3)print(fibonacci)print('help:')help(fibonacci)
functools.wraps在执行之后,重新将函数赋值给原函数:wrapper = fibonacchi。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。