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.