2017-10-04 4 views
2

私はデコレータについて少し知っています。私の理解不足で デコレータ関数は元の関数を構築するものは何でも飾ら目的球宣言戻る(最も合理的にこれは呼び出し可能でなければなりません):Pythonで引数を付けてデコレートするのはどういう意味ですか?

def deco(func): 
    def func_wrapper(name): 
     return func(name)+", how are you?" 
    return func_wrapper 

@deco 
def foo(name): 
    return "Hello "+name 

print(foo("Michael")) 

これが与える:

Hello Michael, how are you? 

しかし、何場合をデコレータは、引数と一緒に指定されています。

def deco2(info): 
    def info_decorator(func): 
     def func_wrapper(name): 
      return func(name) + info 
     return func_wrapper 
    return info_decorator 

@deco2(", how are you?") 
def foo2(name): 
    return "Hello "+name 

print(foo2("Regina")) 

を与えます
Hello Regina, how are you? 

このデコレータを扱うための「ルール」とは何ですか? それ代わりに返すのでfoo2 Pythonが最初に与えられた引数とdeco2を呼び出す、と思われる、とは、この呼び出しはまず前の順序で渡されたfoo2はとのような役割を果たしデコレータのための工場を構築することを、を想定しています最終的なラッパーを返す。しかし、この場合、追加の「」(2つではなく3つのdefs)があります。これは私にとって難しく、一般的なルールを特定します。

+2

2番目のデコレータは 'foo2 = deco2("、どうやってですか? ")(foo2)'と 'foo2'の後に置かれます。 –

+0

私は知っていますが、最初のケースではfooの後に 'foo = deco(foo)'が置かれます。それは、Pythonが追加の間接参照を追加することを知っているデコレータの引数ですか? – michael

答えて

3

デコレータ引数なしで適用すると、 @fooの場合、デコレータはその引数としてデコレートされている関数を受け取り、装飾された関数を置き換える呼び出し可能なものを返すことが期待されます。

デコレータ引数で適用すると、 @foo('bar')の場合、デコレータは、装飾された関数をその引数として受け取り、装飾された関数を置き換えるreturnとcallableをとる呼び出し可能オブジェクトを返すことが期待されます。

別の言い方をすれば:引数なしデコレータはわずかに装飾された機能が必要ですが、引数付きのデコレータは、独自の引数を必要とそれが何らかの形で飾られている機能のホールドを取得する必要があります。デコレータへの引数は任意であり、決して制限されないので、デコレータにもデコレータを追加的に渡す方法に関する非制限的なルールを思いつくのは難しいです。その場合、2段階のプロセスが適用されます。デコレータの引数を取得し、デコレータを受け取る別の呼び出し可能なものを返します。

+0

それはちょっと変わったとは思っていましたが... – michael

関連する問題