TypedDict a été introduit dans la PEP-589 et intégré à Python 3.8. Il sert principalement à créer des annotations de type pour les dictionnaires.
- Au lieu d’utiliser
dataclass ou pydantic pour représenter des données de type « record », TypedDict tire parti de la flexibilité des dictionnaires et se montre avantageux lorsque certains champs peuvent être absents.
- Par exemple, on peut définir une classe
Movie et affecter au variable movie un dictionnaire de type Movie
class Movie(TypedDict):
title: str
movie: Movie = {"title": "Avatar"}
Non-totalité
TypedDict prend en charge la non-totalité, c’est-à-dire la possibilité que certains champs soient absents. C’est utile pour implémenter un endpoint HTTP PATCH
- Avec
dataclass, l’absence de champ n’est pas une notion naturelle, ce qui peut rendre l’approche maladroite
- Dans
TypedDict, il est possible de gérer souplement l’absence de champs avec total=False
- La PEP-655 permet de marquer des champs individuels avec
Required et NotRequired
Utiliser TypedDict avec **kwargs
- La PEP-692 permet d’annoter des arguments de mots-clés variables à l’aide de
TypedDict
- L’usage de
TypedDict peut donner une impression de verbosité, mais il devient utile lorsqu’il est réutilisé dans plusieurs définitions de fonctions
- Combiné à la non-totalité, il révèle encore davantage ses points forts
- Par exemple lorsqu’on personnalise un
pytest.fixture tout en relayant certains arguments tels quels
- Il est possible de reproduire un comportement similaire avec des valeurs sentinelles, mais les annotations de type peuvent alors devenir maladroites
Utiliser TypedDict pour l’injection de dépendances
- La PEP-692 permet aussi la vérification de type lors des appels de fonctions utilisant
TypedDict
- C’est utile lorsque de nombreuses ressources partagent une partie de leurs dépendances
- On définit un
TypedDict proche de l’union des kwargs de toutes les ressources
- Puis on réécrit les ressources pour qu’elles acceptent des arguments arbitraires, avant d’utiliser
TypedDict pour l’injection de dépendances
- Le système de types permet alors de détecter les erreurs d’arguments ou les oublis lors de l’injection de dépendances
- Modifier la signature des ressources n’est pas idéal, mais cela reste un changement plus léger que l’adoption d’un framework d’injection de dépendances
- Beaucoup de frameworks ne prennent pas en charge la vérification statique des types
Fonctionnalités à venir
- La PEP-728 permettra de définir le type d’éléments supplémentaires et de déclarer des dictionnaires fermés qui n’acceptent pas d’éléments additionnels
- Cela aidera à définir plus précisément les types « record »
- La PEP-705 permettra de marquer des éléments en lecture seule (selon la date de cette présentation, elle est peut-être déjà sortie)
- Cela répond à des situations où des problèmes peuvent survenir entre différents
TypedDict supposés être intuitivement compatibles, à cause de mutations potentielles (suppression)
Le résumé de GN⁺
TypedDict est avantageux lorsqu’on veut profiter de la flexibilité des dictionnaires dans des situations où certains champs peuvent être absents.
TypedDict offre une option plus souple que d’autres structures de données comme dataclass ou pydantic.
- Choisissez l’outil adapté au domaine, mais gardez aussi en tête les avantages de
TypedDict
2 commentaires
Si les données arrivent souvent de l’extérieur au format JSON ou sont fréquemment exportées hors de Python, il est utile d’utiliser
TypedDict; sinon, je recommande d’utiliser desdataclassstructurées ou desNamedTuple.Avis Hacker News
Les personnes qui préfèrent le typage dynamique prennent progressivement conscience de l’importance des systèmes de types
Pourquoi utiliser
dataclass(slots=True)à la place deTypedDict.foobarau lieu de["foobar"]fatigue moins le poignetSans système qui impose les types,
TypedDictne sert à rienPydanticLe titre « thank you think » paraît excessivement impoli
Dans la phrase concernant l’abonnement, le sens de « None » n’est pas clair
Expérience personnelle avec
TypedDictTypedDictpour annoter des dicts afin d’améliorer la lisibilité du codeLes fonctionnalités de
TypedDictsont bonnes, mais la syntaxe de déclaration est complexe