Python中在对函数使用装饰器后,其实被装饰的函数已经变为另一个函数,它的函数名、属性等已发生改变。为了避免这种影响,functools包中提供了wraps来消除这种作用,写定义装饰器时,在前面加上 @wraps(func),它能保留原有函数的名称和docstring。
不加wraps
from functools import wraps
def my_decorator(func):
def wrapper(*args, **kwargs):
'''decorator'''
print('Calling decorated function...')
return func(*args, **kwargs)
return wrapper
@my_decorator
def example():
"""Docstring"""
print('Called example function')
print(example.__name__, example.__doc__)
执行结果:
(‘wrapper’, ‘decorator’)
[Finished in 0.2s]
加wraps
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
'''decorator'''
print('Calling decorated function...')
return func(*args, **kwargs)
return wrapper
@my_decorator
def example():
"""Docstring"""
print('Called example function')
print(example.__name__, example.__doc__)
执行结果:
(‘example’, ‘Docstring’)
[Finished in 0.5s]