跳至主要內容

KSJ大约 1 分钟

functools.wraps 是 Python 中的一个装饰器,用于装饰另一个装饰器,使其保留被装饰函数的元数据,如函数名、文档字符串等。这在编写装饰器时非常有用,因为装饰器会改变被装饰函数的属性,使得调试和文档生成变得困难。

使用示例

以下是一个没有使用 functools.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 可以看到,函数名和文档字符串都被改变了。

现在,我们使用 functools.wraps 来修复这个问题:

import functools

def my_decorator(func): @functools.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 可以看到,函数名和文档字符串都被正确保留了。

重要性

使用 functools.wraps 可以确保装饰器不会改变被装饰函数的元数据,这对于调试、文档生成和代码可读性非常重要。它通过调用 functools.update_wrapper 函数来实现这一点,该函数会将被装饰函数的属性复制到装饰器函数上。

结论

functools.wraps 是编写装饰器时的一个重要工具,它可以帮助我们保留被装饰函数的元数据,从而提高代码的可读性和可维护性。在编写装饰器时,建议始终使用 functools.wraps 来装饰你的装饰器函数。