--- title: "Repérage dans les dataclasses Python" date: 2020-05-12 author: motius template: post tags: python,dataclasses,développement comments: true --- Bonjour ! Aujourd'hui un tout petit tutoriel pour parler esthétique et sémantique dans le développement Python. Comme vous le savez sûrement, Python a introduit dans sa version 3.7 le nouveau module `dataclasses` qui permet de réduire la verbosité dans la création de classes. Pour rappel, cela permet de transformer quelque chose comme ça : ```python class Chat: def __init__(self, taille: float = None, âge: int = None, # oui oui, c'est légal, déclarez π = math.pi aussi couleur: str = None, vivant: bool = None, # Schrödinger ): self.taille = taille self.âge = âge self.couleur = couleur self.vivant = vivant ``` en ça : ```python @dataclasses.dataclass class Chat: taille: float âge: int couleur: str vivant: bool ``` avec éventuellement plein de paramètres dans le décorateur `dataclass`, que je vous encourage à aller lire dans la doc Python. On devine assez facilement ce que font les options : - init=True - repr=True - eq=True - order=False - unsafe\_hash=False - frozen=False et les conséquences de leurs valeurs par défaut, mais il y a quelques subtilités qui mérite un peu de lecture. Ce sur quoi je souhaitais mettre l'accent dans cet article, c'est l'existence de la méthode `__post_init__` dans le module. En effet, cette méthode est très pratique, et je trouve qu'elle permet facilement de distinguer deux types d'usages de `dataclass`. En général, les classes qui n'utilisent pas cet méthode sont plus souvent des vraies `dataclass`, au sens classes qui contiennent de la données, comparable à une `struct` en C ou au `Records` java à venir. A contrario, celles qui utilisent cette méthode peuvent parfois être des classes qui retiennent un état, par exemple pour de la configuration, mais celles-ci peuvent faire des choses bien plus avancées dans cette méthode qui est appelée automatiquement après la méthode `init` qui, je le rappelle, est gérée par le module `dataclasses`. Par conséquent, si vous rencontrez une `dataclass`, cela peut être pour deux raisons : * utiliser une nouvelle fonctionalité Python déclarative et plus élégante ; * créer un objet contenant principalement de la donnée. Connaître cette distinction _sémantique_ et l'avoir en tête permet une analyse statique du code à la lecture plus rapide, je suis tombé sur une occurrence de ce phénomène et la partage donc. Joyeux code ! Motius