Retour au cours

dataclasses : modèles de données immuables, eq, order

les dataclasses réduisent le boilerplate des objets “données”.

objectifs

  • créer une dataclass immuable
  • bénéficier de __repr__, __eq__, order
  • gérer des champs mutables proprement

explication détaillée

@dataclass(frozen=True, order=True) :

  • objets hashables et comparables
  • immuabilité : moins d’effets de bord field(default_factory=...) pour les champs mutables.

exemples exécutables

from dataclasses import dataclass, field

@dataclass(frozen=True, order=True, slots=True)
class Produit:
    prix: float
    nom: str
    tags: list[str] = field(default_factory=list, compare=False)

p = Produit(9.9, "stylo")
print(p, p == Produit(9.9, "stylo"))
print(sorted([Produit(3,"a"), Produit(2,"b")]))
# mapping léger item -> prix
@dataclass(frozen=True)
class Item:
    id: int
    name: str
    price: float

catalogue = [Item(1,"stylo",2.5), Item(2,"carnet",4.0)]
print({i.id: i for i in catalogue})

bonnes pratiques

  • préférer frozen=True et slots=True quand possible
  • default_factory pour les conteneurs
  • garder les dataclasses simples (sinon, vraie classe métier)

pièges courants

  • oublier default_factory → liste partagée
  • tenter de modifier un champ d’un objet frozen
  • comparer des objets avec des champs non comparables

exercices

  1. User(id:int, name:str) immuable et triable par name.
  2. inventaire : liste d’Item, totaliser le prix.
  3. ajouter un champ created_at: datetime avec valeur par défaut (bonus).