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

「functools.wraps」は Python デコレータで関数のメタデータをどのように保持しますか?

Mary-Kate Olsen
リリース: 2024-11-30 05:52:22
オリジナル
669 人が閲覧しました

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

functools.wraps の謎を明らかにする: 関数メタデータの維持

デコレーターは、Python 関数の機能を拡張する上で重要な役割を果たします。ただし、多くの場合、名前、docstring、引数リストなどの重要な関数メタデータが失われるという代償を伴います。幸いなことに、functools.wraps が救世主として登場し、この貴重な情報を保存します。

デコレータを適用すると、元の関数がラッパー関数に置き換えられ、特定の重要な詳細が見えにくくなります。たとえば、次の例を考えてみましょう。

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

@logged
def f(x):
    """does some math"""
    return x + x * x
ログイン後にコピー

print(f.__name__) を実行すると、「with_logging」が生成され、f.__doc__ は空の文字列を返します。この結果は、ラッパー関数 with_logging が f.

functools.wraps の代わりに使用されているために発生します。デコレータ関数をラップし、デコレータ関数のメタデータがそのまま残るようにすることで、この問題に対処します。以下に示すように、 @wraps(func) を内部関数に適用することで、目的の動作を復元します。

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

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

print(f.__name__)  # prints 'f'
print(f.__doc__)   # prints 'does some math'
ログイン後にコピー

この改訂された例では、 f.__name__ は "f" を表示し、 f.__doc__ は正しく反映します。元の関数の docstring。メタデータの保存は、関数の ID、ドキュメント化、およびイントロスペクション機能を維持するために重要です。

したがって、functools.wraps はデコレータ ツールキットの重要なツールであり、情報の損失を防ぎ、デコレートされた関数の保持を保証することを覚えておいてください。意図した属性。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート