装饰模块vs函数工具.wrapps

2024-04-24 14:46:59 发布

您现在位置:Python中文网/ 问答频道 /正文

^{} module和{a2}的功能密切相关。两者之间有什么区别(从python3.3/3.4开始)?在

我知道一个区别:3+ years agodecorator支持帮助,而{}没有(另请参见this)。在


Tags: 功能a2decoratorthisagomodule区别years
3条回答

根据与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,而不是{}。用python3.4进行了测试。在

您链接的文档中列出了一个主要区别:decorator保留了包装函数的签名,而{}则没有。在

有两个区别:

  • decorator确实保留签名,而functools.wraps则不,即使在Python3.7中。我所说的签名是指help()signature()以及所有的{},当然,也就是说,如果用户提供了错误的参数,则包装器不会执行任何正确的{}。正如this post中所解释的,functools.wraps出现在中以保留签名,但实际上并没有保留签名。

  • 使用decorator时,总是在kwargs中接收参数,而这些参数不是var位置的-这使得实现包装器更加容易。使用functools.wraps时,根据其名称获取参数值要困难得多,因为它可能在*args**kwargs或其他地方(如果它是可选参数,并且不是用户提供的)

由于我非常喜欢functool.wrapsAPI,但是想解决以上两个问题,所以我创建了^{}。它提出了@wraps的一个推广,它使用了与decorator完全相同的技巧,甚至支持签名修改,如添加和删除参数。它已经被几个项目使用过了,请不要犹豫尝试一下!在

相关问题 更多 >