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
@tracer
def 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的使用:
也就是说,原函数的属性失效了
如果想要保留原函数的属性,就可以用到functools.wraps了
from functools import wraps
def 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
@tracer
def 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。
原文地址:http://blog.51cto.com/13914991/2173042
时间: 2024-10-16 07:36:06