functools.wraps 的作用
编写装饰器时为什么要使用 functools.wraps?它解决了什么问题?
回答
小字辈
不使用 wraps 时,装饰后的函数会丢失原函数的元信息(__name__, __doc__, __module__ 等)。
from functools import wraps
def my_decorator(func):
@wraps(func) # 复制 func 的元信息到 wrapper
def wrapper(*args, **kwargs):
"""Wrapper function"""
return func(*args, **kwargs)
return wrapper
@my_decorator
def greet(name):
"""Say hello"""
print(f'Hello {name}')
print(greet.__name__) # 不加 wraps: 'wrapper',加了: 'greet'
print(greet.__doc__) # 不加 wraps: 'Wrapper function',加了: 'Say hello'
wraps 本质上是调用 update_wrapper(wrapper, func),复制 __module__, __name__, __qualname__, __doc__, __dict__, __wrapped__。