2017-06-02 7 views
0
def log(func): 
    def wrapper(*args, **kw): 
     print('call %s():' % func.__name__) 
     return func(*args, **kw) 
    return wrapper 
@log 
def now(): 
    print('2017-5') 

なぜラッパー関数を入れ子にするのはなぜですか?それはstackoverflowの最初の質問です。私は英語では良くありません。私の説明hava問題は、私を許してください。デコレータについてなぜpythonデコレータ関数は関数をネストしますか?

def log(func): 
    print('call %s():' % func.__name__) 
    return func(*args, **kw) 
@log 
def now(): 
    print('2017-5') 
+0

2番目のオプションを試しましたか?あなたは何を見たの?それはあなたの質問に答えます。 –

+0

(* args、** kw)を削除すると、正しく実行できます。しかし、関数ログはパラメータを取得できません。 – AllitWell

答えて

0

ビット:あなたが気づくことができるように、第1のオプションでprint('call %s():' % func.__name__)は、あなたの関数nowがある任意の時間と呼ばれる、

func = decorator(func) 

@decorator 
def func(): 
    ... 

が正確に等しいですあなたのプログラムで呼び出されます。 2番目のオプションでは、このprintは、デコレータがnowを呼び出さずにのみ適用されるときに呼び出されます。

デコレータが元の関数を変更された関数に置き換えるため、ネストされた関数が使用されます。

関連する問題