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éfini True
par défaut:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
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 nouveau total
mot-clé introduit dans Python 3.8 :
# cypthon/typing.py
class _TypedDictMeta(type):
def __new__(cls, name, bases, ns, total=True):
"""Create new typed dict class object.
...
"""
...
if not hasattr(tp_dict, '__total__'):
tp_dict.__total__ = total
...
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:
# rgb_bad.py
from typing import TypedDict
class Color(TypedDict):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
# rgb_good.py
from typing import TypedDict
class Color(TypedDict, total=False):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
Démo
Si une clé est manquante, mypy se plaindra à la ligne de commande:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
Le réglage total=False
permet des clés optionnelles:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
Voir également
- Tweet de R. Hettinger démontrant la totalité
- Section PEP sur la totalité dans PEP 589
- Article Section sur les types et
TypedDict
en Python 3.8 par Real Python
typing-extensions
package à utiliser TypedDict
dans Python 3.5, 3.6
typing
internes ne sont pas documentés et la partie qui est mal documentée.