functools.wraps 的用处

war*_*iuc 5 python python-decorators

我一直用functools.wraps与我的装饰器一起使用,但今天我问自己为什么?

\n\n
def requires_auth(function):\n\n    @functools.wraps(function)\n    def wrapper(request, *args, **kwargs):\n        ...\n        return function(request, *args, **kwargs)\n\n    return wrapper\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个博客说:

\n\n
\n

由于装饰器只是一个包装原始函数的函数,因此它会将function.__name__属性替换为它\xe2\x80\x99自己的名称,这可能会在调试代码和(或)在某些特定情况下使用内省(inspect/traceback模块等)时导致一些误解状况)。

\n
\n\n

因此functools.wraps有助于复制包装函数的 , ,但我的问题是谁需要它__name____doc__

\n\n

这个答案说:

\n\n
\n

如果使用装饰器总是意味着丢失有关函数的信息,那么这将是一个严重的问题。

\n
\n\n

但这是一个“严重的问题”吗?

\n\n

该页面说:

\n\n
\n

最后一点要记住的是,尝试检查__name____doc__将从包装器获取这些值。这可能会使文档生成工具或依赖此信息的其他类型的代码变得混乱。

\n
\n\n

好的,这是一个正确的观点,但是这是一个关键问题吗?

\n\n

我宁愿不使用,functools.wraps因为我使用了pdb很多,如果我获得一个函数的属性与其他函数的属性,它会使调试变得更加困难。

\n\n

显式的比隐式的好。

\n\n

我发现的所有支持始终使用的信息functools.wraps看起来并不令人信服。我错过了什么吗?

\n