ホームページ  >  記事  >  バックエンド開発  >  Python で装飾された関数の署名を保存するにはどうすればよいですか?

Python で装飾された関数の署名を保存するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-17 17:02:02581ブラウズ

How to Preserve the Signature of Decorated Functions in Python?

装飾された関数の署名の保持

デコレーターは、既存の関数の動作を拡張するための Python の強力なツールです。ただし、関数に適用すると、結果として得られる装飾された関数は、多くの場合、元のドキュメントと署名を失います。これは、特にロギングや引数の変換などの一般的なタスクを実行する汎用デコレータを使用する場合に問題になる可能性があります。

一般的な回避策

一般的な回避策には次のようなものがあります。

  • 装飾された関数の docstring に署名を含めます。
  • 特定の署名ごとに特殊なデコレータを作成します。

デコレータ モジュールを使用します

より堅牢な解決策は、@decorator.decorator というデコレータ関数を提供するデコレータ モジュールを使用することです。このデコレーターを独自のデコレーター関数に適用すると、元の関数の署名を保持できます。

<code class="python">import decorator

@decorator.decorator
def args_as_ints(f, *args, **kwargs):
    args = [int(x) for x in args]
    kwargs = dict((k, int(v)) for k, v in kwargs.items())
    return f(*args, **kwargs)

@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z

print(funny_function("3", 4.0, z="5"))  # 22
help(funny_function)
# Help on function funny_function in module __main__:
#
# funny_function(x, y, z=3)
#     Computes x*y + 2*z</code>

Python 3.4

Python 3.4 以降では、 functools.wraps() 関数を使用して署名を保存できます。

<code class="python">import functools

def args_as_ints(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return func(*args, **kwargs)
    return wrapper

@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z

print(funny_function("3", 4.0, z="5"))  # 22
help(funny_function)
# Help on function funny_function in module __main__:
#
# funny_function(x, y, z=3)
#     Computes x*y + 2*z</code>

以上がPython で装飾された関数の署名を保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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