From 93b34b0d2db814af80c79833b0a8feca49edbee8 Mon Sep 17 00:00:00 2001 From: motius Date: Tue, 12 May 2020 16:33:12 +0200 Subject: [PATCH] [wip] python dataclasses --- .../repérage_dans_les_dataclasses_python.md | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 content/posts/repérage_dans_les_dataclasses_python.md diff --git a/content/posts/repérage_dans_les_dataclasses_python.md b/content/posts/repérage_dans_les_dataclasses_python.md new file mode 100644 index 0000000..de2ef6f --- /dev/null +++ b/content/posts/repérage_dans_les_dataclasses_python.md @@ -0,0 +1,65 @@ +--- +title: Repérage dans les dataclasses Python +date: 2020-05-12 +author: motius +template: post +tags: python,dataclasses,Développement +--- + +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