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)