你永遠叫你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
在我的包裝return func, wrapper
我得到一個錯誤說的元組對象不可調用。
錯誤一定是來自於你做這樣的事情:
def my_dec(func):
def wrapper():
decoration = "decorated"
print(decoration)
# Now `my_dec` returns a tuple instead of a function
return func, wrapper
記住裝潢is (roughly) equivalent to just doing:
def my_func():
...
my_func = my_dec(my_func)
你my_dec()
裝飾現在返回的元組(func, wrapper)
,而不是包裝函數,所以當你試圖撥打my_func()
時,你實際上試圖「調用」已被分配給my_func
的元組。
正如你應該學習如何使用functools.wraps
,這是一個方便的功能調用update_wrapper()
,其更新包裝功能看起來像FUNC一個很好的措施:
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