← retour aux snippets

dataclasses: default_factory pour mutables

Définir des listes/dicts par défaut sans piège des mutables partagés.

python dataclasses #dataclasses#factory#mutable

objectif

Définir des listes/dicts par défaut sans piège des mutables partagés.

code minimal

from dataclasses import dataclass, field

@dataclass
class Bag:
    items: list[int] = field(default_factory=list)

a = Bag(); b = Bag()
a.items.append(1)
print(b.items == [])  # attendu: True (pas partagé)

utilisation

from dataclasses import dataclass, field
@dataclass
class D: m: dict[str,int] = field(default_factory=lambda: {"x":1})
print(D().m["x"] == 1)

variante(s) utile(s)

from dataclasses import dataclass, field
@dataclass
class C: s: set[int] = field(default_factory=set)
c = C(); c.s.add(2); print(2 in c.s)

notes

  • Ne jamais utiliser []/{} directement comme valeur par défaut.
  • default_factory appelle une fonction à chaque instanciation.