あなたのwrapper
に包まれfunc
を呼び出すことはありませんしています。例えば、呼び出しを追加します:
def my_dec(func):
def wrapper():
decoration = "decorated"
print(decoration)
# Call the decorated function and return what it returns
return func()
return wrapper
@my_dec
def my_func():
a = "Original"
print (a)
print(my_func())
は今(func()
implicitly returns None
以降)を生成します:
decorated
Original
None
私は私のラッパーreturn func, wrapper
の私のreturn文でfunc
が含まれている場合、私はタプルを言ってエラーが出ますオブジェクトは呼び出し不可能です。 is (roughly) equivalent to just doingを飾ることを忘れないでください
def my_dec(func):
def wrapper():
decoration = "decorated"
print(decoration)
# Now `my_dec` returns a tuple instead of a function
return func, wrapper
:
エラーはあなたのような何かをやってから来るんだろうあなたのmy_dec()
デコレータは今タプル(func, wrapper)
の代わりに、ラッパー関数を返さ
def my_func():
...
my_func = my_dec(my_func)
だから、
my_func()
に電話しようとすると、実際には
my_func
に割り当てられたタプルを「呼び出す」ことを試みています。あなたはFUNC
見えるようにラッパー機能を更新する、update_wrapper()
を呼び出すための便利な機能である、functools.wraps
を使用する方法を学ぶ必要があります良い対策として :
from functools import wraps
def my_dec(func):
@wraps(func)
def wrapper():
decoration = "decorated"
print(decoration)
return func()
return wrapper
それがなければ、あなたは」取得dは:
In [4]: print(my_func.__name__)
wrapper
とラップと:
In [9]: print(my_func.__name__)
my_func
__doc__
のような他の有用な属性もコピーします。
予想される出力と実際の出力を含めることで、質問を改善することができます。 – quamrana