高度パイソン(関数型プログラミング)[2-8] Pythonのデコレータデコレータ

Pythonのデコレータで書かれてませんパラメータ

パイソンのデコレータの性質は、それは、高階関数であるパラメータとしての機能を受信し、新しい機能を返します

(f)はそのようなコードを飾る= F書かれた手を回避するために、Pythonで提供デコレータ構文@使用。

@logの定義を考えてみましょう:

。1  DEF:(F)ログ#がデコレータ、本質的に高次関数、パラメータとして、そして新しい関数fn返す(F)受信機能書く
2      DEF のFn(X):
 3          印刷 ' コール' + F. __name__ + ' ()... ' 印刷機能の呼び出しを可能にします
。4          リターン F(X) 、Fのための関数を返す(x)は、唯一のパラメータX 
5つの     リターンのFn #は、新しい関数を返します

階乗関数の場合は、@うまく仕事をログインします。

1  @log
 2  DEF (N)階乗:
 3      リターン(減らすラムダ:のx * yを、範囲(1、N + 1 X、Y ))
 4  印刷階乗(10)

結果:

階乗()を呼び出し...
 3628800

しかし、引数が与えられますコールの機能ではありません。

@log
 DEF (X、Y)を追加:
     戻り X + Y
 の印刷追加(1、2)

結果:

1  トレースバック(最新の呼び出しの最後):
 2    ファイル" test.py "、ライン15は、中に <モジュール>
 3      印刷アドオン(1,2 4 TypeError例外:FN()は正確に1引数(2与えられた)を取り

ので  、追加()関数は、2つの引数を取りますが、唯一つのパラメータで死者を返す関数を記述@log

定義されたパラメータは、Pythonで利用することができる任意の適応機能を作る@Log  *引数と**キロワット、任意の数の引数は、常に通常の通話を確認してください。

1  DEF :(f)のログ
 2      DEF FN(* argsを、** キロワット):
 3          プリントは ' 呼び出し' + Fを。__name__ + ' ()... ' 
4          リターン F(* argsを、** キロワット)
 5      リターン FN

タスク

@performanceを入力してください、それは時間の関数呼び出しをプリントアウトすることができます。

。1  インポート時間
 2  
。3  DEFのパフォーマンス(F): 書き込み時間デコレータ、関数呼び出しのための印刷時間は
4。     DEFのFn(* argsを、**キロワット): 適応は、任意のパラメータを定義し、任意の数のことを確実にしますパラメータは常に通常の呼である
。5          T1 = time.time() 呼び出し前のタイミング
6          R&LT = F(*引数、**キロワット)fが呼び出す関数である
。7          T2 = time.time() 通話終了タイミング
8          印刷 ' %FSにおける呼%のS()'%(F. __name__、(T2- T1))
 。9          リターン R&LTの#のリターン機能
10      リターンのFn新しい関数fnを返す
。11          
12は、 
13である @performance
 14  DEF (N)階乗:
 15      リターン減らす(ラムダ X、Y:X * Y、範囲(1 ,. 1 N- + ))
 16  
。17  印刷階乗(10)

 

おすすめ

転載: www.cnblogs.com/ucasljq/p/11622124.html