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 サイトの他の関連記事を参照してください。