场景:你写了一个装饰器作用在某个函数上,但是这个函数的重要的元信息比如名字、文档字符串、注解和参数签名都丢失了
任何时候你定义装饰器的时候,都应该使用 functools 库中的 @wraps 装饰器来注解底层包装函数
import time
from functools import wraps
def cal_time(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
@cal_time
def func(n:int):
for _ in range(n):
pass
func()
@wraps 有一个重要特征是它能让你通过属性 wrapped 直接访问被包装函数
func.__wrapped__(3)
网友评论