2

ラップされた関数の引数を検査できるデコレーターを構築しようとしています。必要なコンテキストは、特定の引数が関数にヒットする前に簡単に検証できるようにすることであり、チェック/検証が必要なすべての場所でチェックするボイラープレートを回避します。

ただし、これは書くのが難しいデコレーターではなく、これで仕事が完了します (たとえば、値が 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デコレータが間違った場所にあることに気付きましwrappedsome_other_decorator

4

1 に答える 1

0

他のデコレータを制御していますか?その場合は、呼び出し元の関数を適切にラップして、すべてが適切に機能することを確認してください。

  import functools
  def check_arg(func):
      @functools.wraps(func)
      def wrapped(value):
          assert value is not None
          func(value)
      return wrapped
于 2013-02-07T14:06:31.767 に答える