ホームページ >バックエンド開発 >Python チュートリアル >`functools.wraps` は Python デコレータで元の関数属性をどのように保持しますか?

`functools.wraps` は Python デコレータで元の関数属性をどのように保持しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-01 21:10:15229ブラウズ

How Does `functools.wraps` Preserve Original Function Attributes in Python Decorators?

functools.wraps について

Python プログラミングでは、関数に機能を追加するためにデコレーターがよく使用されます。ただし、decorators を使用すると、元の関数が新しい関数に置き換えられる場合があり、名前、docstring、引数リストなどの重要な関数属性が失われる可能性があります。

ここで functools.wraps が登場します。これは、ユーザーがデコレータを適用するときに元の関数の属性を保持できるようにするデコレータです。基本的に、デコレータによって作成された新しい関数を元の関数の属性で「ラップ」します。

次の例を考えてみましょう。

def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

このデコレータを使用すると、次のことが保証されます。関数は、ロギング機能によって変更されていても、元の名前、docstring、および引数リストを保持します。これがどのように機能するかの例を次に示します。

@logged
def f(x):
    """does some math"""
    return x + x * x

print(f.__name__)  # prints 'f'
print(f.__doc__)   # prints 'does some math'

functools.wraps がなければ、デコレーターは元の functionf を別の名前で docstring のない新しい関数に置き換えることになるため、識別と解釈が困難になります。関数の動作。

以上が`functools.wraps` は Python デコレータで元の関数属性をどのように保持しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。