在 python 中更改函数的 __qualname__ 时会发生什么?

2024-06-26

为了能够pickle嵌套函数(用于多重处理),我用装饰器装饰了嵌套函数:

def globalize_one(func):
    def wrapper_one(*args,**kwargs):
        return func(*args,**kwargs)
    setattr(modules['__main__'],'sdfsdf',wrapper_one)
    return wrapper_one

然而,当我运行这个装饰器时,这个装饰器不起作用

def test_one():
    @globalize_one
    def inside_one():
        return 1

    try:
        pickle.dumps(inside_one)
    except Exception as e:
        print(e)

test_one()

我收到了异常Can't pickle local object 'globalize_one.<locals>.wrapper_one'

为了让装饰器工作,我需要做的就是改变__qualname__ of wrapper_one to sdfsdf in globalize_one就在该行之前setattr(modules['__main__'],'sdfsdf',wrapper_one).

def globalize_two(func):
    def wrapper_two(*args,**kwargs):
        return func(*args,**kwargs)

    # the single extra line as compared to globalize_one
    wrapper_two.__qualname__ = 'sdfsdf'

    setattr(modules['__main__'],'sdfsdf',wrapper_two)
    return wrapper_two

def test_two():
    @globalize_two
    def inside_two():
        return 1

    try:
        pickle.dumps(inside_two)
    except Exception as e:
        print(e)

通过运行代码可以看到,嵌套函数inside_two现在可以腌制了。

我的困惑是,为什么要改变__qualname__,装饰器会正常工作吗?我认为更改函数名称没有实际效果。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 python 中更改函数的 __qualname__ 时会发生什么? 的相关文章

随机推荐

  • 为seaborn lmplot添加文本注释

    我正在尝试为聚类结果创建seaborn lmplot 数据示例如下所示 ID CA IP clusters 38 10 3 5 6 1 59 10 4 6 1 0 64 10 0 6 6 1 35 10 6 5 6 1 54 10 6 5
  • node-express app.get() 在 webstorm 中标记为未解决

    如果您关注 JetBrainsWebStorm 中的 Node js 入门 http blog jetbrains com webstorm 2014 01 getting started with node js in webstorm
  • 安装 mysql2 时出错:无法构建 gem 本机扩展

    我在尝试安装时遇到一些问题mysql2Rails 的宝石 当我尝试通过运行安装它时bundle install or gem install mysql2它给了我以下错误 安装 mysql2 时出错 错误 无法构建 gem 本机扩展 我该如
  • 如何在没有 sudo 的情况下安装 gem

    在我所有的 gem 安装中 我必须执行 sudo 所以 sudo gem 安装rails 会起作用 而只有 宝石安装导轨 不管用 我该如何补救 我安装了rvm murtaza murtaza dev which rvm home murta
  • 无法运行 ActionBarSherlock

    我有一个 2 2 android 项目 我想添加 ActionBarSherlock 当我运行我的项目时 我收到此错误 C Users vitaly Downloads ActionBarSherlock 4 2 0 ActionBarSh
  • 如何检测角度7中的url变化包括参数和查询参数

    我需要检测一个组件中路径参数和查询参数的 url 更改 path category key component CollectionPageComponent 最后的网址将是例如类别 T恤 or 类别 T 恤 页 2我需要根据类别获取所有产
  • 使用 lombok 注释继承出现错误

    在我的项目中 lombok 用于避免为类编写 getter 和 setter 我有两节课Child延伸Parent Value Builder AllArgsConstructor JsonIgnoreProperties ignoreUn
  • Laravel 5 错误处理

    我正在使用 Laravel 5 并且正在尝试制作自定义 404 页面和自定义异常处理 但我不知道将代码放在哪里 前段时间有一个 ErrorServiceProvider 不再存在 有人能给我一些指点吗 编辑 我看到他们在 App Excep
  • Flask-SQLAlchemy 构造函数

    在 Flask SQLAlchemy 教程中 定义了 User 模型的构造函数 from flask import Flask from flask ext sqlalchemy import SQLAlchemy app Flask na
  • Android 使用键盘上的“完成”按钮来单击按钮

    好的 在我的应用程序中 我有一个供用户输入数字的字段 我已将该字段设置为仅接受数字 当用户单击该字段时 它会弹出键盘 键盘 ICS 上 上有一个完成按钮 我希望键盘上的完成按钮能够触发我的应用程序中的提交按钮 我的代码如下 package
  • Entity Framework 5 Code First - 如何“重新开始”?

    我一直在我的应用程序中成功使用 EF 5 Code First 我大约有40张桌子 但是 我遇到了一个问题 我似乎可以正确处理迁移 所以 我想做的就是以某种方式告诉 EF 将数据库的当前模式视为一个新的起点 并从这个点开始管理它 这样 我可
  • 检查输出是否重定向

    我有一个用 C 编写的控制台应用程序 它处理一些数据然后打印结果 在结果可用之前 会有一个小动画 和不断更新的进度百分比 xx 显然 如果用户重定向我的应用程序的输出 这将被打印到输出重定向到的文本文件中 如果可能的话我想避免这种情况 那么
  • C++ 17 编译器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有可以运行 C 17 代码的在线地方 因为我想学习新功能 https github com Anth
  • R 中具有 NA 值的聚合栅格

    我在 R 中有一个分辨率为 1 公里的栅格 其 NA 值分布广泛 但位置不规则 即 包含数据的单元格不连续 并且 NA 值分散 我正在尝试使用用户定义的平均圆角函数 包括在下面 以 5 公里分辨率 因子 5 聚合此栅格 使用 raster
  • “代理人没有身份”是什么意思?

    我成功关注了这些说明 https help github com articles generating ssh keys 来自 GitHub 关于如何生成 SSH 密钥的信息 我与 GitHub 的连接成功 但是当我稍后想检查我的 SSH
  • 将互操作颜色转换为 System.Drawing.Color

    我正在寻找如何在 C 中将 Microsoft Office Interop Word Excel PowerPoint Color 转换为 System Drawing Color 我在这个论坛发现了相反的情况here https sta
  • 椭圆形留下痕迹

    我正在尝试制作一个简单的球动画 从面板的一个角开始到另一个角 我为此编写了一个程序 当我运行程序时oval or ball留下踪迹 我的意思是说 当程序运行时 它会留下 颜色痕迹 在我的程序中timer每 100 毫秒触发一个事件 以下是负
  • “伊甸园空间”的名字起源于垃圾收集

    在垃圾收集术语中 为什么它被称为 伊甸园空间 就这样 我还在熟悉这个术语 我不明白为什么它有这样的名字 伊甸园空间是创建对象的地方 他们的生活都很幸福 但最终他们被小天使赶到了年轻一代和老一代的荒野中 他们永远不会被允许回到伊甸园空间 他们
  • Python中Shift和Caps Lock的状态

    我正在使用 Python 2 5 编写 TkInter 应用程序 我需要找出大写锁定和 Shift 键的状态 true 或 false 我在整个网络上进行了搜索 但找不到解决方案 Tkinter 中的键盘事件可能很棘手 我建议您按顺序查看以
  • 在 python 中更改函数的 __qualname__ 时会发生什么?

    为了能够pickle嵌套函数 用于多重处理 我用装饰器装饰了嵌套函数 def globalize one func def wrapper one args kwargs return func args kwargs setattr mo