decoratorモジュールの機能とfunctools.wraps密接に関連しています。2つの違いは何ですか(Python 3.3 / 3.4以降)?
私は1つの違いを認識しています。3年以上前、decoratorサポートされていたヘルプとサポートされてwrapsいなかったものです(これも参照してください)。
decoratorモジュールの機能とfunctools.wraps密接に関連しています。2つの違いは何ですか(Python 3.3 / 3.4以降)?
私は1つの違いを認識しています。3年以上前、decoratorサポートされていたヘルプとサポートされてwrapsいなかったものです(これも参照してください)。
主な違いの 1 つは、リンク先のドキュメントに記載されています。decoratorラップされた関数の署名を保持しますが、保持しwrapsません。
BrenBarn との議論によると、最近functools.wrapsでは、ラップされた関数の署名も保持されます。IMHOこれにより、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ではなく andを使用する必要があることに注意してくださいgetargspec。Python 3.4 でテスト済み。