Cannot pickle Mock/MagicMock objects, or use them with multiprocessing

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

@johnslavik がすでに取り組んでいます。

2026年7月26日 から。

評価

この issue はまだ評価されていません。

説明

stdlib type-feature

Mocks and MagicMocks from the unittest.mock packages cannot be pickled, which means that unittests that call multiprocessing code with a mock will fail. Example:

from unittest.mock import Mock, MagicMock
import pickle

class Foo:
    pass

pickle.dumps(Mock(spec=Foo))
pickle.dumps(MagicMock(spec=Foo))

Both of the pickle.dumps commands at the bottom raise: PicklingError: args[0] from __newobj__ args has the wrong class. The same exception is raised when calling e.g. multiprocess.starmap where one of the starmap parameters is the mocked object, but it took me quite some time to dig into the starmap arguments to figure this out.

I'm running python version 3.10.6.

This appears to be the same issue as described in #58782, but that was closed in 2012 with an implication that this is intended behavior, and "it looks like implementing __reduce__ is sufficient for my use case", but no explanation of how to properly implement said __reduce__. At the very least, including some information in e.g. the unittest.mock or pickle documentation about how to work around this would be very useful.

主要言語
Python
スター
77.2k
フォーク
36k
平均マージ
1日 9時間
マージ済み PR(30日)
558

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

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

python/cpython のほかの issue

python/cpython の issue をすべて見る

似ている issue

Python の issue をもっと見る

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

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