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 でテスト済み。