Python - AI 助手

Python functools.wraps() 函数



Python 的 wraps() 函数可能会使调试和维护代码更具挑战性。此函数通过将原始函数的元数据复制到包装函数来解决此问题。

它防止原始元数据和其他属性确保装饰函数的标识。通过维护原始数据,它使代码更具可读性,并更易于理解以供将来维护。

语法

以下是 wraps() 函数的语法。

@functools.wraps(wrapped, assigned = WRAPPER_ASSIGNMENTS, updated = WRAPPER_UPDATES)

参数

partial() 函数的参数如下所示:

  • wrapped: 装饰器包装的函数。
  • assigned: 元组指定函数中哪些属性直接分配给包装函数。
  • updated: 元组指定函数中哪些属性直接更新到包装函数。

返回值

此函数返回包装函数,该函数已更新以包含原始函数的元数据。

示例 1

在下面的示例中,我们定义了一个装饰器,在调用函数之前和之后打印消息。wraps() 函数确保了原始元数据。

import functools
def simple_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("Before calling the function")
        x = func(*args, **kwargs)
        print("After calling the function")
        return x
    return wrapper
@simple_decorator
def farewell(name):
    """Farewells a person."""
    print(f"Goodbye, {name}!")
farewell("John")
print(farewell.__name__)
print(farewell.__doc__)

输出

结果如下所示:

Before calling the function
Goodbye, John
After calling the function
farewell
Farewells a person

示例 2

wraps() 函数在创建装饰器时保留原始函数的元数据,并且还指定装饰函数保留给定数据的标识。

在下面的示例中,我们直接输入数据以使用 wraps() 函数转发消息。

def mydoc(func):
    def wrapper(*args, **kwargs):
        return f'{func(*args, **kwargs)}!#$'
    wrapper.__name__ = func.__name__
    wrapper.__doc__ = func.__doc__
    return wrapper
@mydoc
def greet(name):
    """Returns greeting text."""
    return f'Hello, {name}'
print(greet('Alice'))  
print(greet.__name__)  
print(greet.__doc__)	

输出

代码如下所示:

Hello, Alice!#$
greet
Returns greeting text.

示例 3

wrapper_sum 函数 wraps add 函数,该函数计算两个数字的和。

def wrapper_sum(func):
    def wrapper(x, y):
        return func(x, y)
    return wrapper
@wrapper_sum
def add(x, y):
    return x + y
print(add(10, 24))

输出

输出如下所示:

34
python_modules.htm
广告