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
廣告