Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Incorrect deserialization of subclasses, module changed to `types`

オープン
#468 コメント 4 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
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
フォーク
198
平均マージ
1日 10時間
マージ済み PR(30日)
1

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

cloudpipe/cloudpickle のほかの issue

cloudpipe/cloudpickle の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。