← retour aux snippets

dataclasses: validation simple dans __post_init__

Définir un modèle immuable et valider les entrées dès la construction.

objectif

Définir un modèle immuable et valider les entrées dès la construction.

code minimal

from dataclasses import dataclass
from typing import List

@dataclass(frozen=True)
class User:
    name: str
    roles: List[str]

    def __post_init__(self):
        if not self.name:
            raise ValueError("name vide")
        if not all(isinstance(r, str) for r in self.roles):
            raise TypeError("roles doivent être des str")

u = User("Ada", ["admin", "user"])
print(u.name == "Ada")  # attendu: True

utilisation

try:
    User("", ["x"])
except ValueError as e:
    print("name" in str(e))

variante(s) utile(s)

from dataclasses import dataclass, field
from typing import Tuple
@dataclass(frozen=True)
class Cfg:
    flags: Tuple[str, ...] = field(default_factory=lambda: ("fast",))
c = Cfg(); print("fast" in c.flags)

notes

  • Utilisez frozen=True pour l’immutabilité (hashable).
  • Préférez default_factory pour les conteneurs.