unittest.mock.patch.object holds references for too long
Abierto
Nadie ha tomado este issue todavía.
performance
stdlib
type-bug
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 36k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Bug report
Bug description:
import sys
from unittest import mock
import json
def main():
obj = 'asdfa' * 2000
print("BEGIN", sys.getrefcount(obj))
for i in range(10):
with mock.patch.object(json, 'dumps', return_value=3):
from json import dumps
dumps(obj)
del dumps
print("END", sys.getrefcount(obj))
import gc; gc.collect()
print("AFTERGC", sys.getrefcount(obj))
if __name__ == '__main__':
main()
The code prints:
BEGIN 2
END 12
AFTERGC 2
Because it is the user's data that is leaked, the leaked object could be huge and could cause non-trivial problems.
CPython versions tested on:
3.13
Operating systems tested on:
Linux
Linked PRs
- gh-139937
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con unittest.mock.patch.object y la reproducción proporcionada; después, lee el PR vinculado gh-139937 para conocer la investigación actual. Verifica los recuentos de referencias antes y después de contextos de patch repetidos y de la recolección de basura; se considera terminado cuando el objeto del usuario ya no permanece referenciado después de que finalicen los contextos.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- testing
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100