11

decoratorモジュールの機能とfunctools.wraps密接に関連しています。2つの違いは何ですか(Python 3.3 / 3.4以降)?

私は1つの違いを認識しています。3年以上前decoratorサポートされていたヘルプとサポートされてwrapsいなかったものです(これも参照してください)。

4

3 に答える 3

6

主な違いの 1 つは、リンク先のドキュメントに記載されています。decoratorラップされた関数の署名を保持しますが、保持しwrapsません。

于 2012-12-17T03:22:06.450 に答える
6

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

于 2015-12-14T09:22:37.230 に答える