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.