9.2 创建装饰器时保留函数元信息
问题
你写了一个装饰器作用在某个函数上,但是这个函数的重要的元信息比如名字、文档字符串、注解和参数签名都丢失了。
解决方案
任何时候你定义装饰器的时候,都应该使用 functools 库中的 @wraps 装饰器来注解底层包装函数。例如:
import time
from functools import wraps
def timethis(func):
'''
Decorator that reports the execution time.
'''
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end-start)
return result
return wrapper下面我们使用这个被包装后的函数并检查它的元信息:
讨论
@wraps 有一个重要特征是它能让你通过属性 __wrapped__ 直接访问被包装函数。例如:
__wrapped__ 属性还能让被装饰函数正确暴露底层的参数签名信息。例如:
Last updated
Was this helpful?