Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Incorrect deserialization of subclasses, module changed to `types`

未关闭
#468 4 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
tooling

调研方向

首先在当前的 cloudpickle checkout 上运行 issue 中的复现脚本,然后跟踪 Parent 和 Child 类的反序列化路径。将得到的 module、字符串表示和 MRO 与预期的 main 值进行比较。当子类反序列化能够保留原始模块和 MRO,并且有一个覆盖该复现的回归测试时,即表示完成。

由索引模型根据 Issue 内容生成。

描述

This issue is similar to #440 but I have verified it still happens after the fix (on latest master).

Somehow the deserialized subclass has __module__ of types instead of __main__. This also happen when the classes are moved to their separate files.

See the following repro script:

import cloudpickle
import multiprocessing as mp

print(cloudpickle.__version__)

class Parent:
    pass

class Child(Parent):
    pass

def get_mro(klass):
    return [f"{base.__module__}.{base.__qualname__}" for base in klass.mro()]

def task(b: bytes):
    cls = cloudpickle.loads(b)
    return str(cls), get_mro(cls)

for klass in [Parent, Child]:
    with mp.Pool() as pool:
        cls_name, mros = pool.apply(task, (cloudpickle.dumps(klass),))
    print()
    print("local class name", str(klass))
    print("deserialized class name", cls_name)
    print()
    print("local mro", get_mro(klass))
    print("deserialized mro", mros)

My output on Python 3.7 f758eb34d1b3285dc582b73bfd8df4c47ed4fc68

2.1.0.dev0

local class name <class '__main__.Parent'>
deserialized class name <class '__main__.Parent'>

local mro ['__main__.Parent', 'builtins.object']
deserialized mro ['__main__.Parent', 'builtins.object']

local class name <class '__main__.Child'>
deserialized class name <class 'types.Child'>

local mro ['__main__.Child', '__main__.Parent', 'builtins.object']
deserialized mro ['types.Child', '__main__.Parent', 'builtins.object']
主要语言
Python
星标
1.9k
派生
197
平均合并
1 天 10 小时
30 天内合并 PR
1

环境准备

我们还没有检查这个项目的环境配置文件。先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

cloudpipe/cloudpickle 的其他 Issue

查看 cloudpipe/cloudpickle 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。