ラップされた関数の引数を検査できるデコレーターを構築しようとしています。必要なコンテキストは、特定の引数が関数にヒットする前に簡単に検証できるようにすることであり、チェック/検証が必要なすべての場所でチェックするボイラープレートを回避します。
ただし、これは書くのが難しいデコレーターではなく、これで仕事が完了します (たとえば、値が None でないことを確認するため):
def check_arg(func):
def wrapped(value):
assert value is not None
func(value)
return wrapped
上記の例は製品コードではなく、機能するものの例にすぎませんが、装飾する関数で他のデコレーターを使用できる場合、問題が明らかになります。
その場合、value
別のデコレーターになる可能性があるため、上記のデコレーターの例は機能しません。ここに別のネストされた関数を追加することもできますが、プログラムで処理するより良い方法があるように見えます。さらに、デコレータの数が変わるたびに関数が壊れてしまいます。
使用されるデコレータの数に関係なく、ラップされた関数の引数を取得するにはどうすればよいですか?
編集:私は単にデコレータを積み重ねているのではなく、再利用可能なデコレータを装飾する1つのデコレータを使用していることに注意してください。上記の例では、このコンテキストでそれを再利用します。
@check_arg
def some_other_decorator(func):
def wrapped(*args, **kw):
... # some interaction here
return wrapped
この編集を書いているときに、check_arg
デコレータが間違った場所にあることに気付きましwrapped
たsome_other_decorator
。