我们知道python装饰器的作用是在不改变原函数结构的情况下,对一个目标函数功能的扩展。但是被被装饰器修饰的函数,其函数名等函数属性会发生改变,这就相当于另外一个函数了。所以在python中提供了装饰器wraps(func)来解决这个问题。
下面用一个例子进行说明:
不使用wraps装饰器的情况
import time from functools import wraps def timeit(func): def wrapper(*args, **kwargs): """这是timeit,装饰器""" start = time.time() ret = func(*args, **kwargs) end = time.time() print('used:',end-start) return ret return wrapper @timeit def foo(): """这是foo,被装饰函数""" print('in foo()') print(foo.__name__) print(foo.__doc__)
打印的结果是:
使用wraps装饰器的情况
import time from functools import wraps def timeit(func): @wraps(func) def wrapper(*args, **kwargs): """这是timeit,装饰器""" start = time.time() ret = func(*args, **kwargs) end = time.time() print('used:',end-start) return ret return wrapper @timeit def foo(): """这是foo,被装饰函数""" print('in foo()') print(foo.__name__) print(foo.__doc__)
打印结果:
对比两次的打印结果发现,不使用wraps装饰器的时候,函数的名字等属性都发生了变化,使用wraps装饰器后,被装饰的函数还是能保持原先函数的属性不变,这就是wraps装饰器的神奇之处。好了,这次关于wraps装饰器就讲到这里了,关于wraps的更多信息可以参考python的官方文档进行了解。