5 points par GN⁺ 2024-10-14 | 2 commentaires | Partager sur WhatsApp
  • 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

 
ilotoki0804 2024-10-15

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 des dataclass structurées ou des NamedTuple.

 
GN⁺ 2024-10-14
Avis Hacker News
  • Les personnes qui préfèrent le typage dynamique prennent progressivement conscience de l’importance des systèmes de types

    • Un meilleur système de types est supérieur à un moins bon
  • Pourquoi utiliser dataclass(slots=True) à la place de TypedDict

    • L’accès aux attributs est plus rapide, donc le code est plus performant
    • Les classes à slots utilisent moins de RAM et exercent moins de pression sur le cache L1, donc le code est plus rapide
    • Lors de l’accès aux attributs, utiliser .foobar au lieu de ["foobar"] fatigue moins le poignet
    • Si on se trompe dans le nom d’un attribut, cela provoque une erreur à l’exécution
  • Sans système qui impose les types, TypedDict ne sert à rien

    • Même si l’on stocke par erreur une chaîne dans un attribut annoté, Python de base ne l’empêche pas et n’émet aucun avertissement
    • Pour réellement imposer les types, il faut utiliser un outil comme Pydantic
  • Le titre « thank you think » paraît excessivement impoli

    • « than i thought » se lit mieux
  • Dans la phrase concernant l’abonnement, le sens de « None » n’est pas clair

    • La grammaire est trop complexe, ce qui rend la compréhension difficile
  • Expérience personnelle avec TypedDict

    • J’utilise TypedDict pour annoter des dicts afin d’améliorer la lisibilité du code
    • Cela m’a permis de passer moins de temps à suivre les chemins d’exécution du code
    • Il faudrait de meilleures pratiques de développement, mais c’est une bonne solution pour les applications qui utilisent beaucoup de dicts
  • Les fonctionnalités de TypedDict sont bonnes, mais la syntaxe de déclaration est complexe