Dans la nouvelle version de Python 3.8, il y a une nouvelle annotation de type typing.TypedDict
. Sa documentation mentionne que
Les informations de type pour l'introspection sont accessibles via
Point2D.__annotations__
etPoint2D.__total__
. [....]
Bien que cela __annotations__
soit bien connu, ayant été introduit dans le PEP 3107 , je ne trouve aucune information sur __total__
. Quelqu'un pourrait-il expliquer sa signification et, si possible, son lien avec des sources faisant autorité?
python
python-3.x
python-typing
Antti Haapala
la source
la source
typing
internes ne sont pas documentés et la partie qui est mal documentée.Réponses:
Je suppose que le
__total__
champ signifie si les instances doivent être complètes (par défaut) ou non (tous les champs sont facultatifs). J'ai commencé ma recherche au PEP 589 , qui a présentéTypedDict
et décrit la totalité comme telle. Il a utilisé untotal
argument, qu'il serait judicieux de renommer dunder-style pour laclass
syntaxe. Cependant, je n'ai pas trouvé quand un tel changement de nom a eu lieu.En examinant MyPy, qui est le vérificateur de type réel qui se soucie de ces annotations, il existe une documentation
TypedDict
et une totalité similaires , mais encore une fois aucune référence à la syntaxe du dunder. Creuser dans son implémentation a conduit à plus de confusion, carTypedDictType
dans types.py n'a pas un champ total, mais séparéitems
etrequired_keys
. La totalité impliquerait cela,items.keys()==required_keys
mais la mise en œuvre fait des hypothèses différentes, commecan_be_false
s'appuyeritems
uniquement sur .total=False
devrait en principe signifierrequired_keys
est vide.La source CPython pour _TypedDictMeta révèle au moins que l'
total
argument et le__total__
dunder sont une seule et même chose, bien que la source se décritTypedDict
comme "pourrait être ajoutée bientôt".la source
can_be_false
Personnellement, je soupçonne que la chose est un bogue MyPy, probablement lié au fait de ne pas avoir prévu d'avoir des champs facultatifs dès le début.TypedDict
a été accepté dans Python 3.8 via PEP 589 . Depuis Python, il apparaît que__total__
c'est un drapeau booléen définiTrue
par défaut:Comme mentionné dans d'autres articles, les détails de cette méthode sont limités dans la documentation , mais le lien de @Yann Vernier vers le code source CPython suggère fortement qu'il
__total__
est lié au nouveautotal
mot-clé introduit dans Python 3.8 :Comment ça marche?
Synopsis : par défaut, toutes les clés sont requises lors de l'instanciation d'une définition
TypedDict
.total=False
outrepasse cette restriction et autorise les clés facultatives. Voir la démonstration suivante.Donné
Une arborescence de répertoires de test:
Code
Fichiers dans le répertoire de test:
Démo
Si une clé est manquante, mypy se plaindra à la ligne de commande:
Le réglage
total=False
permet des clés optionnelles:Voir également
TypedDict
en Python 3.8 par Real Pythontyping-extensions
package à utiliserTypedDict
dans Python 3.5, 3.6la source