首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`functools.update_wrapper`和`functools.wraps`复制了比预期更多的属性

`functools.update_wrapper`和`functools.wraps`复制了比预期更多的属性
EN

Stack Overflow用户
提问于 2020-01-31 18:37:51
回答 1查看 185关注 0票数 0

我在装饰器的定义中使用functools.wraps将函数的一些属性转发给它的包装器。根据基于functools.wrapsfunctools.update_wrapper文档,默认情况下,functools.wraps应该将包装函数的属性__module____name____qualname____annotations____doc__分配给包装器。但是,在我自己的用法中,我看到functools.wraps也转发了我在包装函数中定义的任何属性。

代码语言:javascript
复制
import functools


def decorator(func):
    func.added_attr = 'I am added.'

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper


@decorator
def foo():
    pass


print(foo.added_attr)

在上面的示例中,foo最终引用了在decorator中定义的包装器,但是这个包装器也具有在包装函数中定义的added_attr。有人能解释一下文档中没有提到的这种行为吗?

注意:我在Python3.7和3.8中测试了上面的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-31 18:46:06

来自update_wrapper文档(重点是我):

这些参数的默认值是模块级常量WRAPPER_ASSIGNMENTS (它分配给包装函数的__module____name____qualname____annotations____doc__,文档字符串)和(更新包装函数的,即实例字典).**

func.added_attr = 'I am added.'更新由update_wrapper复制的func.__dict__

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60009512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档