Maîtriser Python Attrs : construire classes de données avancées avec exemples pratiques

Le package Python Attrs permet de créer classes de données avancées avec annotations simples. Python a son module natif dataclass, mais Attrs offre fonctionnalités supplémentaires !
Installer attrs
Package pas dans librairie standard, installation via pip ou Pipenv. Créez environnement virtuel pour ne pas interférer autres projets. Package = attrs :
$ pip install attrs
# ou avec pipenv:
$ pipenv install attrs
Attrs vs dataclasses
Auteurs d'attrs ont travaillé sur le PEP introduisant dataclasses en Python. Dataclasses natives volontairement simples ; attrs = gamme complète fonctionnalités !
Raisons choisir attrs over dataclasses natives :
- Python < 3.7. Attrs supporte toutes versions mainstream, y compris CPython 2.7 et PyPy.
- Plus de fonctionnalités : validateurs et convertisseurs.
- Performance optimale et mémoire minimale via classes slotted attrs.
Exemple basique Python attrs
import attr
@attr.s
class Person(object):
name = attr.ib(default='John')
surname = attr.ib(default='Doe')
age = attr.ib(init=False)
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)
# Output:
# Person(name='John', surname='Doe', age=NOTHING)
# Person(name='Bill', surname='Gates', age=60)
Observations :
- Syntaxe moins élégante/plus verbeuse que dataclasses, mais fonctionnalités en plus.
- Représentation formatée sympa à l'impression (comme dataclasses).
attr.ib,attr.snoms courts, importattrsuffit. Alternative :from attr import attrib, attrs.
Regardons les fonctionnalités clés sur dataclasses : validateurs et convertisseurs.
Exemple validateur Python attrs
Deux façons d'ajouter validateurs :
- Via décorateur
- Fournissant fonction callable
Démonstration méthode callable. Attrs offre validateurs built-in, dont instance_of :
>>> @attr.s
... class C(object):
... x = attr.ib(validator=attr.validators.instance_of(int))
>>> C(42)
C(x=42)
>>> C("une string")
Traceback (most recent call last):
...
TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...
On a essayé créer objet C avec string pour x, validateur instance_of lance erreur car requiert int pas string.
Définissons notre propre validateur :
import attr
@attr.s
class DividableByTwo(object):
x = attr.ib()
@x.validator
def check(self, attribute, value):
if value % 2 != 0:
raise ValueError(f'{value} n\'est pas divisible par 2')
print(DividableByTwo(60))
print(DividableByTwo(11))
# Output:
# DividableByTwo(x=60)
# ...
# ValueError: 11 n'est pas divisible par 2
Exemple convertisseur Python attrs
Convertisseur prend valeur définie et la convertit auto. Utilisable pour plein de choses. Ex: conversion auto en int. Méthode callable, ici int() Python :
import attr
@attr.s
class C(object):
x = attr.ib(converter=int)
c = C("1")
print(c)
# Output:
# C(x=1)
Entrée (string « 1 ») convertie en entier auto. Convertisseurs s'exécutent AVANT validateurs, donc on peut valider valeur finale après conversion. Ex: combiner les deux exemples : convertir n'importe quelle entrée en int, puis vérifier divisibilité par 2.
Utiliser slots avec Python attrs
Enfin, on peut dire à attrs d'utiliser classes slotted. Avantages classes slotted :
- Empreinte mémoire réduite
- Plus rapides
En bref : classe slotted = on déclare explicitement attributs d'instance attendus. Python saute certaines vérifications = moins mémoire, légère accélération. Détails doc attrs.
Mais classes slotted ont pièges, surtout créées manuellement. Heureusement, attrs offre activation simple :
import attr
@attr.s(slots=True)
class YourClassName:
...
Continuer à apprendre
- Notre article sur classes de données Python
- Notre tutoriel classes et objets Python
- Pour plus d'exemples, page exemples attrs
Python
- Maîtriser la méthode strip() de Python : Guide complet et exemples pratiques
- Maîtriser str.count() de Python : Compter caractères et sous-chaînes avec exemples
- Fonction Python round() expliquée avec exemples pratiques
- Maîtriser la fonction Python map() : syntaxe, exemples et bonnes pratiques
- Python timeit() : mesurer le temps d'exécution avec exemples pratiques
- Python Counter dans collections : comptage efficace, mise à jour et opérations arithmétiques
- Python time.sleep() : comment ajouter des délais dans votre code (exemple)
- Python list.count() : Guide Expert avec Exemples Pratiques
- Python list.index() : Comment Trouver les Positions d'Éléments avec Exemples Pratiques