使用 functools.wraps 具体能解决哪些问题?

2017-06-25 23:02:15 +08:00
 nlimpid

看到 fluent python 第 7 章例 7-15 中写道:

最开始实现的装饰器有几个缺点:不支持关键字参数,而且遮盖了被装饰函数的 namedoc 属性。

之后用 functools.wraps 解决。函数自身的属性好理解,但是为什么新版能够正确处理关键字参数呢?

附上前后两个装饰器代码 https://notepad.pw/code/c2cetz9um

2531 次点击
所在节点    Python
6 条回复
wwqgtxx
2017-06-26 01:51:02 +08:00
因为他本身的实现类似于
def wraps(func):
def _warps(_func):
_func.__name__=func.__name__
_func.__doc__=func.__doc__
return _func
return _warps
wwqgtxx
2017-06-26 01:52:28 +08:00
重新排版一下
def wraps(func):
----def _warps(_func):
--------_func.__name__=func.__name__
--------_func.__doc__=func.__doc__
--------return _func
----return _warps
wwqgtxx
2017-06-26 01:58:33 +08:00
至于“装饰器不支持关键词参数”,好奇具体是怎么个不支持法,请说明具体的不支持的写法
nlimpid
2017-06-26 08:26:21 +08:00
@wwqgtxx 我就是看原文是直接这么写的才问的。
gulu
2017-06-26 20:00:45 +08:00
楼主试试用 Pycharm 去 Ctrl + B 吧 😀
kkzxak47
2017-06-28 13:07:55 +08:00
"Sadly most decorators are broken because the web is full of bad advice."
https://hynek.me/articles/decorators/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/371013

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX