2017-08-20 10 views
2

私は関数デコレータを使用しようとしましたが、この例では私のためにうまくいきません。解決法を教えてください。Python関数デコレータエラー

def multiply_by_three(f): 
    def decorator(): 
     return f() * 3 
return decorator 

@multiply_by_three 
def add(a, b): 
    return a + b 

print(add(1,2)) # returns (1 + 2) * 3 = 9 

通訳を印刷エラー:「例外TypeError:デコレータは、()0位置引数を取りますが、2は、与えられた」あなたはデコレータを使用する場合

+2

それは真実を語っています。あなたの 'decorator'関数は引数を取らず、' add(1,2) 'を呼び出すときに、' decorator(1,2) 'を呼び出します。これは' multiply_by_three'メソッドから返すものです。また、( 'multiply_by_three'は実際のデコレータであるので)議論することを非常に混乱させるので、それを"デコレータ "と呼ぶことは避けてください。 – larsks

答えて

4

、あなたはデコレータから返す関数は古い機能を置き換えます。つまり、decoratorの機能はaddの代わりにmultiply_by_threeになります。

これは、各関数シグネチャの一致が、引数を含めて一致する必要があることを意味します。しかし、コードaddには2つの引数があり、decoratorには引数がありません。 decoratorにも2つの引数を渡す必要があります。あなたは*args and **kwargsを使用して簡単に行うことができます。

def multiply_by_three(f): 
    def decorator(*args, **kwargs): 
     return f(*args, **kwargs) * 3 
    return decorator 

あなたが今、あなたの関数を飾ると、それを実行した場合、あなたはそれが動作を確認できます。

@multiply_by_three 
def add(a, b): 
    return a + b 

print(add(1,2)) # 9