unittest.mock.patch.object holds references for too long
Offen
Dieses Issue hat noch niemand übernommen.
performance
stdlib
type-bug
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
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
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
Beginne mit unittest.mock.patch.object und der bereitgestellten Reproduktion und lies dann den verknüpften PR gh-139937 zur aktuellen Untersuchung. Überprüfe die Referenzanzahlen vor und nach wiederholten Patch-Kontexten und der Garbage Collection; abgeschlossen ist die Untersuchung, wenn das Objekt des Benutzers nach dem Ende der Kontexte nicht mehr referenziert wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- testing
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 25/100