decorator
module和functools.wraps
的功能密切相關。這兩者之間有什麼區別(從Python 3.3/3.4開始)?裝飾模塊vs functools.wraps
我知道一個區別:3+ years ago,decorator
支持的幫助,而wraps
沒有(另請參閱this)。
decorator
module和functools.wraps
的功能密切相關。這兩者之間有什麼區別(從Python 3.3/3.4開始)?裝飾模塊vs functools.wraps
我知道一個區別:3+ years ago,decorator
支持的幫助,而wraps
沒有(另請參閱this)。
一個主要的區別是上市鏈接到您的文檔權:decorator
保留包裝的函數的簽名,而wraps
沒有。
這似乎不再是這種情況了,是正確的嗎? –
@ChieltenBrinke:你的意思是'functools.wraps'現在保留了簽名?我在文檔中沒有看到任何關於這方面的信息,但是我沒有安裝Python 3.5來測試它。 – BrenBarn
同意它不在文檔中,但在Python shell(3.4)中測試它似乎表示它可以工作 –
通過與BrenBarn的討論,現在functools.wraps
也保留了包裝函數的簽名。恕我直言,這使得decorator
裝飾幾乎過時。
from inspect import signature
from functools import wraps
def dec(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
def dec2(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
def foo(a: int, b):
pass
print(signature(dec(foo)))
print(signature(dec2(foo)))
# Prints:
# (*args, **kwargs)
# (a:int, b)
注意,一要利用signature
而不是getargspec
。用python 3.4測試。
另一個示例:[保留裝飾函數的簽名](http://stackoverflow.com/q/147816/4279) – jfs