python / python/cpython

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

Offen
#100,090 0 Kommentare 27 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

@johnslavik arbeitet bereits daran.

Seit 26.7.2026.

stdlib type-feature
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
36k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.