标准库functools中的wrap函数用于包装函数,原始函数,如__name__、__doc__、__annotations__等,而不更改原始函数的功能
我们先来看一个简单的例子
importfunctoolsdeffunc _1(x : str )-none : ' ' function : return 3360 none ' ' print ' ' ' func _1), x ) @functools.wraps(func_1) def demo ) ) : (' demo : return : none ' ' ' ' ' print ' ' demo ' ) ) ) demo ) demo demo.__doc__ ) print ) demoannotations: ),demo.__ ) ) demoannotations360 ),demo )。
demoname : func _1demodoc : function : return : nonedemoannotations : { ' x ' : class ' str ',' return ' 3333333330 demo函数本身的功能不变。 “demo”将被打印,但__name__将被打印
functools.wrap可用于装饰器的内层函数,以抵消装饰器的副作用。 因为如果使用装饰器的话,原函数会被内层函数代入覆盖,函数名等信息会丢失。 (
definfo(func ) :defwrap(a,b ) : return func(a ) a,b ) return wrap@infodef multiply(x ) x,y ) : returnx
当multiply name: wrap使用装饰器时,multiply指向内层函数wrap,因此其名称为wrap
可以包装内层函数
definfo(func ) :@functools.wraps ) func ) def wrap(a ) a,b ) : return func(a ) a,b ) return wrap @ info def MUF
因为multiply name: multiply @info装饰器与multiply=info(multiply )等价,所以func指的是原来的multiply函数,@functools.wraps ) func
请注意,wrap函数与原始multiply函数的参数兼容