Cyclic reference lead to contextlib.contextmanager exception not being deleted
Nadie ha tomado este issue todavía.
- 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:
Consider the following code.
from contextlib import contextmanager
class MyException(Exception):
def __del__(self):
print("deleted")
@contextmanager
def f():
try:
yield
except MyException:
pass
with f():
raise MyException()
print("done")
In Python 3.11 the printed value is deleted done, in Python 3.12 the printed value is done deleted. Which means the exception is kept around much longer than it need to be, this is caused by a reference cycle between the exception and the frame in contextmanager implementation.
CPython versions tested on:
3.11, 3.12
Operating systems tested on:
Linux
Linked PRs
- gh-129276
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
Reproduce el ejemplo proporcionado de contextlib.contextmanager en Python 3.11 y 3.12; después, inspeccione la implementación de contextlib.contextmanager para rastrear las referencias a la excepción y al frame. Se considera completado cuando la excepción se libera sin la eliminación retrasada observada en Python 3.12; el PR vinculado gh-129276 indica que ya se está trabajando en ello.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 25/100