Cyclic reference lead to contextlib.contextmanager exception not being deleted
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Reproduzieren Sie das bereitgestellte contextlib.contextmanager-Beispiel unter Python 3.11 und 3.12 und untersuchen Sie anschließend die Implementierung von contextlib.contextmanager, um die Verweise auf die Exception und den Frame nachzuverfolgen. Erledigt ist die Aufgabe, wenn die Exception ohne die in Python 3.12 beobachtete verzögerte Löschung freigegeben wird; der verknüpfte PR gh-129276 weist darauf hin, dass daran bereits gearbeitet wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 25/100