2012-12-17 106 views

回答

5

一個主要的區別是上市鏈接到您的文檔權:decorator保留包裝的函數的簽名,而wraps沒有。

+0

這似乎不再是這種情況了,是正確的嗎? –

+0

@ChieltenBrinke:你的意思是'functools.wraps'現在保留了簽名?我在文檔中沒有看到任何關於這方面的信息,但是我沒有安裝Python 3.5來測試它。 – BrenBarn

+0

同意它不在文檔中,但在Python shell(3.4)中測試它似乎表示它可以工作 –

1

通過與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測試。