Dataclasses Python

PythonBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous serez initié aux Dataclasses Python (Classes de Données Python), une fonctionnalité puissante disponible à partir de Python 3.7. Les Dataclasses sont des classes Python ordinaires principalement utilisées pour stocker des données. Elles utilisent un décorateur, @dataclass, pour générer automatiquement des méthodes spéciales telles que __init__() et __repr__(), ce qui réduit considérablement le code répétitif (boilerplate code).

Tout au long de ce laboratoire, vous apprendrez à :

  • Définir une Dataclass simple.
  • La comparer avec une implémentation de classe standard.
  • Définir des valeurs par défaut pour les champs.
  • Gérer les indications de type (type hints), y compris l'utilisation de typing.Any.

À la fin de ce laboratoire, vous serez en mesure d'écrire des classes centrées sur les données plus propres et plus concises en Python.

Fonctionnalités des Dataclasses

Dans cette étape, vous allez découvrir les fonctionnalités de base des classes de données (dataclasses). Nous commencerons par examiner une classe Python standard utilisée pour stocker des données, puis nous verrons comment une dataclass la simplifie.

Une classe standard vous oblige à écrire manuellement la méthode __init__ pour initialiser les attributs.

Par exemple, une classe représentant un nombre pourrait ressembler à ceci :

class Number:
    def __init__(self, val):
        self.val = val

obj = Number(2)
print(obj.val)

Avec le décorateur @dataclass, Python génère automatiquement la méthode __init__, ainsi que d'autres méthodes utiles comme __repr__ pour une représentation textuelle propre. L'exigence principale est que vous devez fournir des indications de type (type hints) pour les champs.

Note: Si vous n'êtes pas familier avec l'utilisation de l'environnement WebIDE (similaire à VS Code), veuillez vous familiariser avec celui-ci lors de ce laboratoire.

Créons la même classe Number en utilisant le décorateur @dataclass.

Ouvrez le fichier features.py depuis l'explorateur de fichiers à gauche. Ajoutez le code suivant :

from dataclasses import dataclass

@dataclass  ## Ce décorateur convertit la classe en dataclass
class Number:
    val: int  ## L'indication de type est requise

## La méthode __init__ est créée automatiquement
obj = Number(2)

## Affiche la valeur de l'attribut 'val'
print(obj.val)

## La méthode __repr__ est également créée automatiquement, offrant une belle représentation
print(obj)

Exécutez maintenant le script depuis le terminal pour voir le résultat.

python3 features.py

Vous verrez la sortie suivante. La première ligne est la valeur de l'attribut, et la seconde ligne est la représentation propre de l'objet fournie par la méthode __repr__ générée automatiquement.

2
Number(val=2)

Comme vous pouvez le constater, la version avec dataclass est plus concise et nécessite moins de code répétitif (boilerplate code).

Utilisation des Valeurs par Défaut

Dans cette étape, vous allez explorer comment ajouter des valeurs par défaut aux champs d'une dataclass. C'est une exigence courante lorsque certains attributs sont optionnels.

Une règle clé à retenir est que tout champ ayant une valeur par défaut doit être déclaré après tous les champs sans valeur par défaut.

Créons une dataclass Product où name est un champ obligatoire, mais count et price sont optionnels et possèdent des valeurs par défaut.

Ouvrez le fichier defaults.py dans l'explorateur de fichiers. Ajoutez le code suivant :

from dataclasses import dataclass

@dataclass
class Product:
    name: str        ## Champ obligatoire
    count: int = 0   ## Champ optionnel avec une valeur par défaut
    price: float = 0.0  ## Champ optionnel avec une valeur par défaut

## Créer une instance en fournissant uniquement le champ 'name' obligatoire
obj = Product("Python")

## Afficher les attributs pour voir les valeurs par défaut en action
print(f"Name: {obj.name}")
print(f"Count: {obj.count}")
print(f"Price: {obj.price}")

Maintenant, exécutez le script dans le terminal.

python3 defaults.py

La sortie montrera que count et price se sont vu attribuer automatiquement leurs valeurs par défaut.

Name: Python
Count: 0
Price: 0.0

Cette fonctionnalité rend la création d'objets avec des attributs optionnels très pratique.

Gestion des Indications de Type (Type Hints)

Dans cette étape, vous comprendrez l'exigence d'utiliser des indications de type (type hints) dans les dataclasses. Comme vous l'avez vu, fournir un type pour chaque champ est obligatoire lors de la définition d'une dataclass.

Cependant, il peut y avoir des situations où vous ne souhaitez pas ou ne pouvez pas spécifier un type de données concret pour un champ. Pour ces cas, le module typing de Python fournit un type spécial appelé Any. L'utilisation de Any indique au vérificateur de type (type checker) qu'une valeur peut être de n'importe quel type.

Créons une dataclass où nous utilisons Any pour les champs.

Ouvrez le fichier type_hints.py dans l'explorateur de fichiers et ajoutez le code suivant :

from dataclasses import dataclass
from typing import Any

@dataclass
class WithoutExplicitTypes:
   name: Any
   value: Any = 42

## Créer une instance où 'name' est une chaîne de caractères (string). 'value' utilise sa valeur par défaut.
obj1 = WithoutExplicitTypes(name="Test")
print(f"Object 1: name={obj1.name}, value={obj1.value}")

## Créer une autre instance où 'name' est un entier (integer) et 'value' est une chaîne de caractères (string).
obj2 = WithoutExplicitTypes(name=123, value="hello")
print(f"Object 2: name={obj2.name}, value={obj2.value}")

Maintenant, exécutez le script depuis le terminal.

python3 type_hints.py

Vous verrez la sortie suivante, démontrant que les champs peuvent contenir des valeurs de types différents.

Object 1: name=Test, value=42
Object 2: name=123, value=hello

Bien que Any offre de la flexibilité, il est généralement de bonne pratique d'utiliser des types spécifiques chaque fois que possible pour rendre votre code plus robuste et auto-documenté.

Résumé

Dans ce laboratoire, vous avez appris à utiliser les dataclasses de Python pour créer des classes centrées sur les données, concises et lisibles.

Vous avez couvert les concepts clés suivants :

  • Le décorateur @dataclass génère automatiquement des méthodes spéciales comme __init__() et __repr__(), réduisant ainsi le code répétitif (boilerplate code).
  • Comment définir des champs avec des valeurs par défaut, et la règle selon laquelle ils doivent suivre les champs sans valeur par défaut.
  • Le caractère obligatoire des indications de type (type hints) dans les dataclasses et comment utiliser typing.Any pour les champs pour lesquels un type spécifique n'est pas souhaité.

Les dataclasses sont un outil puissant dans le Python moderne pour écrire du code propre, maintenable et efficace, particulièrement lorsqu'il s'agit de classes qui stockent principalement des états.