python / python/cpython

unittest.mock.patch.object holds references for too long

Offen
#133,423 10 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

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

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Ö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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.