functools.wraps 的作用是将原函数对象的指定属性复制给包装函数对象, 默认有 module、name、doc,或者通过参数选择。
import functools
def itcast1(fun):
# 带参数的装饰器
#wraps是用来将inner函数的属性设置为fun的属性值
@functools.wraps(fun)
def inner(*args, **kwargs):
print("itcast1 start")
fun(*args, **kwargs)
print("itcast1 end")
return inner
上述代码可表示为:
# def itcast1(fun):
# def inner(*args, **kwargs):
# print("itcast1 start")
# fun(*args, **kwargs)
# print("itcast1 end")
# inner.__name__ = fun.__name__
# inner.__doc__ = fun.__doc__
# return inner
>>> @itcast1
... def say_hello():
... print('say_hello')
...
>>> print(say_hello.__name__)
say_hello
若itcast1中没有使用wraps:
>>> def itcast1(fun):
... def inner(*args, **kwargs):
... print('itcast1 start')
... fun(*args, **kwargs)
... print("itcast1 end")
... return inner
...
>>> @itcast1
... def say_hello():
... print('say_hello')
...
>>> print(say_hello.__name__)
inner
>>> say_hello()
itcast1 start
say_hello
itcast1 end