← retour aux snippets

weakref.WeakValueDictionary: cache sans fuite mémoire

Laisser le GC libérer les objets non référencés automatiquement.

python memory #weakref#cache#gc

objectif

Laisser le GC libérer les objets non référencés automatiquement.

code minimal

import weakref, gc

class Obj: pass
cache: "weakref.WeakValueDictionary[int, Obj]" = weakref.WeakValueDictionary()
o = Obj(); cache[1] = o
del o; gc.collect()
print(1 not in cache or cache[1])  # attendu: True (clé purgée)

utilisation

import weakref
class C: pass
w = weakref.WeakValueDictionary()
c = C(); w["k"] = c
print(w["k"] is c)

variante(s) utile(s)

import weakref, gc
class C: pass
w = weakref.WeakValueDictionary(); c = C(); w["x"] = c; del c; gc.collect()
print("x" not in w)

notes

  • Le cache ne garde pas en vie les objets; évite les fuites.
  • Les clés doivent être fortes (ex: int, str); les valeurs sont faibles.