3.1.1.5 获取修饰符的函数属性
更新所包装callable的属性对修饰符尤其有用,因为转换后的函数最后会得到原"裸"函数的属性。
import functools
def show_details(name,f):
"Show details of a callable object."
print('{}:'.format(name))
print(' object:',f)
print(' __name__:',end=' ')
try:
print(f.__name__)
except AttributeError:
print('(no __name__)')
print(' __doc__',repr(f.__doc__))
print()
def simple_decorator(f):
@functools.wraps(f)
def decorated(a='decorated defaults',b=1):
print(' decorated:',(a,b))
print(' ',end=' ')
return f(a,b=b)
return decorated
def myfunc(a,b=2):
"myfunc() is not complicated"
print(' myfunc:',(a,b))
return
# The raw function
show_details('myfunc',myfunc)
myfunc('unwrapped,default b')
myfunc('unwrapped,passing b',3)
print()
# Wrap explicitly.
wrapped_myfunc = simple_decorator(myfunc)
show_details('wrapped_myfunc',wrapped_myfunc)
wrapped_myfunc()
wrapped_myfunc('args to wrapped',4)
print()
# Wrap with decorator syntax.
@simple_decorator
def decorated_myfunc(a,b):
myfunc(a,b)
return
show_details('decorated_myfunc',decorated_myfunc)
decorated_myfunc()
decorated_myfunc('args to decorated',4)
functools提供了一个修饰符wraps(),他会对所修饰的函数应用update_wrapper()。
运行结果: