この問題は、型変換、ロギング、メモ化など、関数の引数を変更する汎用デコレーターで関数を装飾するときに発生します。装飾された関数は元の関数のドキュメントとシグネチャを継承できないため、その動作を理解することが困難になります。
この問題に対処するために、複数の回避策が提案されています。
pip を使用して 'decorator' モジュールをインストールし、decorator.decorator アノテーションを含むようにデコレータ定義を変更します。これにより、関数の署名を保持しながらデコレーターが汎用性を維持することが保証されます。
<code class="python">import decorator @decorator.decorator def args_as_ints(f, *args, **kwargs): # Perform argument conversion return f(*args, **kwargs)</code>
Python 3.4 以降の場合、'functools.wraps( )' は、関数の署名とドキュメントの両方を自動的に保存する代替ソリューションを提供します。
<code class="python">import functools def args_as_ints(func): @functools.wraps(func) def wrapper(*args, **kwargs): # Perform argument conversion return func(*args, **kwargs) return wrapper</code>
どちらの方法も、元の関数の署名とドキュメントを効果的に保存します。 「decorator」モジュールは Python 2 および 3 に適していますが、「functools.wraps()」は Python 3.4 以降でのみ使用できます。
以上が装飾された関数の署名を保存する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。