2016-07-21 12 views
0

デコレータが何であり、何ができるのかを理解するために、私の質問が出てくる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) 

注要するに


+0

デコレータは特別なものだとは思わないでください。 '@ decoraotor_with_args'という行は' decorated_decorator'の定義の後に 'decorated_decorator = decorator_with_args(decorated_decorator)'を呼び出すための構文的な砂糖です。そのことを覚えておいてください。その関数はPythonで渡すことができるオブジェクトであり、自分で答えを見つけることができます。 – Phillip

+0

@Phillip実際、私はこのスニペットを5時間以上見てきました。多分私は最初の間違った道にいるかもしれません。参照してください:http://codereview.stackexchange.com/q/135482/96221 –

+0

@Phillipここに私の現在のアイデアがあります:それは引数リスト '(func、* args、** kwargs)'を引数リストが '(* args、** kwargs)'である別の関数です。しかし、 "失われた"引数 'func'は、私が今理解できない何らかの方法で処理されます。 –

答えて

1

decorator_with_argsは、このような関数呼び出しをオンにします。

+0

* function *の代わりに* function call *を書いています。 – Phillip

+0

@Phillip Edited。 –

関連する問題