デコレータが何であり、何ができるのかを理解するために、私の質問が出てくるthis answerを読んでいます。作成者は、すべてのデコレータは、一般的に任意の引数を受け入れることができますボーナススニペットを提供し、このスニペットは本当に私を混同:このデコレータのデコレータは何をしていますか?
def decorator_with_args(decorator_to_enhance):
def decorator_maker(*args, **kwargs):
def decorator_wrapper(func):
return decorator_to_enhance(func, *args, **kwargs)
return decorator_wrapper
return decorator_maker
@decorator_with_args
def decorated_decorator(func, *args, **kwargs):
def wrapper(function_arg1, function_arg2):
print "Decorated with", args, kwargs
return func(function_arg1, function_arg2)
return wrapper
@decorated_decorator(42, 404, 1024)
def decorated_function(function_arg1, function_arg2):
print "Hello", function_arg1, function_arg2
decorated_function("Universe and", "everything")
この出力:
Decorated with (42, 404, 1024) {}
Hello Universe and everything
が私の質問です:正確には何decorator_with_args
?
デコレータを引数にとり、任意の引数を受け付けるデコレータメーカーでラップし、引数デコレータに渡して、そのデコレータメーカーを返します。つまり、decorator_with_args
は実際にデコレータをデコレータメーカに変えます。不可能なんじゃない?とにかく、その機能を伝えるのは難しいと思う。
はい、元のコードには多くのコメントが含まれていますが、回答を得ることができませんでしたので、コードを削除してコードを短くしてきれいにしました。このフォームに
function(func, *args, **kwargs)
:両方の関数呼び出しは、別の関数を返すこと
function(*args, **kwargs)(fund)
注要するに
デコレータは特別なものだとは思わないでください。 '@ decoraotor_with_args'という行は' decorated_decorator'の定義の後に 'decorated_decorator = decorator_with_args(decorated_decorator)'を呼び出すための構文的な砂糖です。そのことを覚えておいてください。その関数はPythonで渡すことができるオブジェクトであり、自分で答えを見つけることができます。 – Phillip
@Phillip実際、私はこのスニペットを5時間以上見てきました。多分私は最初の間違った道にいるかもしれません。参照してください:http://codereview.stackexchange.com/q/135482/96221 –
@Phillipここに私の現在のアイデアがあります:それは引数リスト '(func、* args、** kwargs)'を引数リストが '(* args、** kwargs)'である別の関数です。しかし、 "失われた"引数 'func'は、私が今理解できない何らかの方法で処理されます。 –