CodeWalk

functools.wraps 的作用

作者:小字辈 · 2026-05-30 12:55

编写装饰器时为什么要使用 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__