2017-09-28 6 views
0

を返すことがあります。 私はデコレータは、私は以下の構文を理解できるようにオブジェクトを返すことがあることを理解する:ここでPythonのデコレータで関数を変更しないと、私はデコレータの動作を理解しようとしている値

def my_deco(fonction): 
    print("Deco is called with parameter the function {0}".format(fonction)) 
    return fonction 

@my_deco 
def hello(): 
    print("hello !") 
Deco is called with parameter the function <function salut at 0x00BA5198> 

デコレータはあまりしませんが、私は機能を変更する必要がある場合には、私が定義したいです初期関数の動作がmodified_func.Thisによって変更され、この

def my_deco(fonction): 
    def modified_func(): 
     print("Warning ! calling {0}".format(fonction)) 
     return fonction() 
    return modified_func 
@my_deco 
def hello(): 
    print("Salut !") 

のようなデコレータは、それが最初の関数の呼び出しが含まれて

結構です。これは、今、私は理解していないものを

罰金です:なぜ我々は、関数の結果を返すのですか?あなたはデコレータを書くとき、通常は、あなたが作る:私の場合、関数は、それがコメントであるので、私は何か、あなたの説明

+2

あなたはデコレータの*は任意の*関数を適用することができ、それらの他の機能は十分戻り値を持っている可能性があるため。関連項目:任意のパラメータのサポート – jonrsharpe

+0

厳密に言えば、fonction()を返す必要はありません。代わりに、単にそれを呼び出すことができます。 'fonction()'を呼び出し、その結果を破棄するか、あるいは適切な状況下で 'fonction'をまったく呼び出さないようにします。それはあなたのデコレーターなので、何が理にかなっているかを決めることができます。それを尋ねるならば、「fonction」の呼び出し元が装飾されていれば、大きく異なる結果が期待されるでしょうか?答えが "いいえ"(そして通常はそうです)の場合、デコレータが返す関数はおそらく 'fonction'の結果を返します。あなたの説明のために – jq170727

+0

に感謝jq170727 – user1649114

答えて

0

ため

感謝を返す必要がありますなぜ私は取得しない、単純な「印刷」であります可能な機能で使用できるようにします。そして、元の関数が返すものを返すか、その戻り値を変換するか(ラッパー関数でも行うことができます)のいずれかを返す方法です。 Pythonで

、すべての機能は、実際に 戻り何かをします。明示的なreturn文がない関数は、値 Noneを返します。あなたのwrpper機能は、デコレータの内側に、常に飾ら関数が返されたものを返すのであれば、それは安全側になります:装飾された機能は、明示的なリターンを持っていない場合でも、それはちょうどあなたのラッパーによって転送され Noneを返します。

さて、それは "必須" ではありません。あなたのデコレータが戻り値のない関数だけに適用されることを事前に知っているならば、あなたはラッパー関数にreturn文を入れないことが自由です - それは不正確な構文ではありません(しかし、自己)。

関連する問題