当编写装饰器作用于函数时,函数的元信息将丢失,例如名称、文档、注释和参数签名。例子:importtimedeftimer_func(func):'''用于调用func函数时计时:paramfunc:函数对象作为外层函数的入参:return:innerfunction'''defwrapper(*args,**kwargs):t1=time.time()r=func(*args,**kwargs)t2=time.time()cost=t2-t1print('时间成本%s'%cost)returnrreturnwrapper@timer_funcdeffunc(n:int):'''这是一个函数测试:paramn::return:'''whilen>0:n=n-1returnn>>>func(10000000)timecost0.6841702461242676>>>print(func.__name__)wrapper#name是内部函数的名字,不再是函数本身的名字>>>print(func.__annotations__){}#注解丢失>>>print(func.__doc__)None#这里文件丢失了这种情况下,使用functools库中的@wraps装饰器来注解底层的wrapper函数可以解决这个问题,例如:deftimer_func(func):'''isusedtofunc函数被调用的时间:paramfunc:函数对象作为外层f的入参函数:返回:内部函数'''@wraps(func)defwer(*args,**kwargs):t1=time.time()r=func(*args,**kwargs)t2=time.time()cost=t2-t1print('时间成本%s'%cost)returnrreturnwer@timer_funcdeffunc(n:int):'''这是一个func测试:paramn::return:'''whilen>0:n=n-1returnn>>>func(10000000)时间成本0.6841702461242676>>>print(func.__name__)func>>>print(func.__annotations__){'n':
