python / python/cpython

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

Abierto
#100,090 0 comentarios 27 reacciones 1 asignado Ver en GitHub

@johnslavik ya está trabajando en esto.

Desde el 26/7/2026.

stdlib type-feature
Lenguaje dominante
Python
Estrellas
77.2k
Forks
36k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

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.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.