2024-04-24 14:46:59 发布
网友
^{} module和{a2}的功能密切相关。两者之间有什么区别(从python3.3/3.4开始)?在
我知道一个区别:3+ years ago,decorator支持帮助,而{}没有(另请参见this)。在
decorator
根据与BrenBarn的讨论,现在functools.wraps也保留了包装函数的签名。因此,decorator装饰器几乎过时了。在
functools.wraps
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进行了测试。在
signature
您链接的文档中列出了一个主要区别:decorator保留了包装函数的签名,而{}则没有。在
有两个区别:
decorator确实保留签名,而functools.wraps则不,即使在Python3.7中。我所说的签名是指help()和signature()以及所有的{},当然,也就是说,如果用户提供了错误的参数,则包装器不会执行任何正确的{}。正如this post中所解释的,functools.wraps出现在中以保留签名,但实际上并没有保留签名。
help()
signature()
使用decorator时,总是在kwargs中接收参数,而这些参数不是var位置的-这使得实现包装器更加容易。使用functools.wraps时,根据其名称获取参数值要困难得多,因为它可能在*args、**kwargs或其他地方(如果它是可选参数,并且不是用户提供的)
kwargs
*args
**kwargs
由于我非常喜欢functool.wrapsAPI,但是想解决以上两个问题,所以我创建了^{}。它提出了@wraps的一个推广,它使用了与decorator完全相同的技巧,甚至支持签名修改,如添加和删除参数。它已经被几个项目使用过了,请不要犹豫尝试一下!在
functool.wraps
@wraps
根据与BrenBarn的讨论,现在
functools.wraps
也保留了包装函数的签名。因此,decorator
装饰器几乎过时了。在注意,必须使用}。用python3.4进行了测试。在
signature
,而不是{您链接的文档中列出了一个主要区别:}则没有。在
decorator
保留了包装函数的签名,而{有两个区别:
decorator
确实保留签名,而functools.wraps
则不,即使在Python3.7中。我所说的签名是指help()
和signature()
以及所有的{functools.wraps
出现在中以保留签名,但实际上并没有保留签名。使用
decorator
时,总是在kwargs
中接收参数,而这些参数不是var位置的-这使得实现包装器更加容易。使用functools.wraps
时,根据其名称获取参数值要困难得多,因为它可能在*args
、**kwargs
或其他地方(如果它是可选参数,并且不是用户提供的)由于我非常喜欢} 。它提出了
functool.wraps
API,但是想解决以上两个问题,所以我创建了^{@wraps
的一个推广,它使用了与decorator
完全相同的技巧,甚至支持签名修改,如添加和删除参数。它已经被几个项目使用过了,请不要犹豫尝试一下!在相关问题 更多 >
编程相关推荐