← retour aux snippets

dataclasses: frozen et validation dans post_init

Créer des objets immuables et valider les champs au démarrage.

python dataclasses #dataclasses#frozen#validation

objectif

Créer des objets immuables et valider les champs au démarrage.

code minimal

from dataclasses import dataclass, field

@dataclass(frozen=True)
class User:
    name: str
    age: int = field(default=0)
    def __post_init__(self):
        if self.age < 0:
            raise ValueError("age négatif interdit")

u = User("Ada", 30)
print(u.name == "Ada" and u.age == 30)  # attendu: True

utilisation

from dataclasses import dataclass
@dataclass(frozen=True)
class Point: x:int; y:int
p = Point(1,2)
print((p.x, p.y) == (1,2))

variante(s) utile(s)

from dataclasses import dataclass, replace
@dataclass(frozen=True)
class C: x:int
c = C(1)
c2 = replace(c, x=2)
print((c.x, c2.x) == (1,2))

notes

  • replace() crée une copie modifiée d’un dataclass frozen.
  • Validez tôt pour éviter des états invalides en aval.