我总是和我的装饰师一起使用functools.wraps
,但今天我问自己为什么?
def requires_auth(function):
@functools.wraps(function)
def wrapper(request, *args, **kwargs):
...
return function(request, *args, **kwargs)
return wrapper
因为decorator只是一个包装原始函数的函数,所以它会将
function.__name__
属性替换为它自己的名称,这会在调试代码时产生一些误解,并且(或)使用内省(inspect
/traceback
模块等在某些条件下)。
所以functools.wraps
有助于复制包装函数的__name__
,__doc__
,但我的问题是谁需要它?
如果使用装饰器总是意味着丢失有关函数的信息,那将是一个严重的问题。
但这是一个“严重的问题”吗?
要记住的最后一点是,尝试检查包装函数的
__name__
和__doc__
将从包装器中获取这些值。这可能会破坏文档生成工具或依赖此信息的其他类型的代码。
好的,有效点,但这是一个关键问题吗?
我宁愿不使用functools.wraps
,因为我经常使用pdb
,如果我获得具有其他函数属性的函数的属性,它可以使调试更难。
明确比隐含更好。
我发现所有使用functools.wraps
支持始终的信息看起来并不令人信服。我错过了什么吗?