2016-12-10 16 views
0

私はPythonには新しく、言語の機能と機能を理解しようとしています。 次のコードを実行すると、エラーメッセージが表示されます。「wrap()は0の位置引数を受け取りますが、2は与えられた」です。n個の引数を取る関数が0個の引数を含むデコレータ関数のサブ関数に渡されたときにエラーメッセージがスローされる

class dec: 

def decorator_function(orig): 
    def wrap(): 
     print('hi') 
     return orig 
    return wrap 

@decorator_function 
def display_inf(name, age): 
    print('dispInf ran with args ({},{})'.format(name,age)) 

display_inf('John',35) 

私はエラーmsgの内容を理解しており、以下のように2つのパラメータを含むようにwrap関数を変更すると、このmsgは取得できません。しかし、私が頭を悩ますことがないのは、なぜpythonがエラーを投げているのかということです。 display_inf関数は、期待どおりにdecorator_functionに渡されますが、折り返し機能に関しては、のように表示されます。関数を使用していないので、なぜ私はそれを使用していない場合、私はまだこのエラーを取得しています。エラーの原因となるシーンの後ろには何が起こりますか。

def decorator_function(orig): 
    def wrap(name, age): 
     print('hi') 
     return orig 
    return wrap 

答えて

1

あなたはデコレータを使用する場合は、元の関数であるはデコレータの戻り値でを置き換えます。あなたの例では、display_infwrapに置き換えられています。 wrapは引数を取らないので、引数で呼び出すと失敗します。

wrapは一度呼び出され、新しい関数を返すと考えられているようですが、それはどのように動作するのでしょうか。デコレータ自体(decorator_functrion)は新しい関数を返し、返すものはwrapです。 wrapは、間違った数の引数で呼び出されたため実際には何も印刷されません。

+0

詳細な説明はありません。今それはすべて理にかなっています:-) – Sharingan

関連する問題