デコレーターは、既存の関数の動作を拡張するための Python の強力なツールです。ただし、関数に適用すると、結果として得られる装飾された関数は、多くの場合、元のドキュメントと署名を失います。これは、特にロギングや引数の変換などの一般的なタスクを実行する汎用デコレータを使用する場合に問題になる可能性があります。
一般的な回避策
一般的な回避策には次のようなものがあります。
デコレータ モジュールを使用します
より堅牢な解決策は、@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 サイトの他の関連記事を参照してください。