2016-04-14 17 views
0

は、私が最初にデコレーターのような操作を行うためのシンタックスシュガーと思っていました最初にデコレータで。Pythonのデコレータとラッパー

整数ではなく関数を返す必要があるのはなぜですか?

+0

これはデコレータが行うことなので、関数を受け取り、新しい関数を返します。 [ドキュメント](https://www.python.org/dev/peps/pep-0318/)を読んだり、そこにあるPythonデコレータの何百もの説明を探していましたか? – BrenBarn

+0

デコレータは基本的にそれを新しい関数にします(同じ引数をとります)。デコレータ自体は引数を知らないので、あなたの関数を呼び出す(評価する)のではありません。あなたが 'x()* 2'をデコレータの中に戻したいのであれば、' x() 'の引数は何でしょうか? – Evert

+0

@brenbarnはい、私は最後の手段としてここに来たのです。あなたの誰かがそれを少しはっきりと説明してくれることを願っています。 –

答えて

3

デコレータは関数を変更する関数の構文的砂糖であり、後者の関数はそれ自身の修正版のように動作します。

簡単な例から始めましょう。私たちは一つのパラメータを取る関数を受け取り、そして機能つのパラメータを取り、元の関数が返すだろうか、二重の復帰を返す

def double_me(f): 
    return lambda x: 2 * f(x) 

を書くと言います。我々は最初のdouble_the_add_oneを変更してdouble_the_add_oneに戻ってそれをバインドされ、その後、double_the_add_oneを定義し

def double_the_add_one(x): 
    return x + 1 
double_the_add_one = double_me(double_the_add_one) 

>>> double_the_add_one(1) 
4 

注:その後、我々はこのようにそれを使用することができます。だから、それはそれ自身の変更されたバージョンです。それはもともと何をするのでしょうか?その後、結果を倍増させます。それは、単一の位置引数があったと仮定

  1. @double_me 
    def double_the_add_one(x): 
        return x + 1 
    
    >>> double_the_add_one(1) 
    4 
    

    上記デコレータがその偉大ではなかったことを注意:デコレーターは、単純にこのビットより簡潔にします。

  2. キーワード引数がないと仮定しました。

  3. デコレーションされた機能にドキュメントストリングがあった場合は、それが詰まっていました。

あなたはおそらく、実際にそこにドキュメントの例を使用してデコレータを書くことfunctools.wrapsを使用する必要があります。

関連する問題