TypedDict
foi aceito no Python 3.8 via PEP 589 . No Python, parece __total__
ser um sinalizador booleano definido como True
padrão:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
Como mencionado em outras postagens, os detalhes sobre esse método são limitados nos documentos , mas o link de @Yann Vernier para o código-fonte CPython sugere fortemente que __total__
está relacionado à nova total
palavra-chave introduzida no 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
...
Como funciona?
Sinopse : por padrão, todas as chaves são necessárias ao instanciar um definido TypedDict
. total=False
substitui essa restrição e permite chaves opcionais. Veja a seguinte demonstração.
Dado
Uma árvore de diretórios de teste:
Código
Arquivos no diretório de teste:
# 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"
Demo
Se uma chave estiver faltando, o mypy irá reclamar na linha de comando:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
A configuração total=False
permite chaves opcionais:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
Veja também
- Tweet por R. Hettinger demonstrando a totalidade
- Seção de PEP sobre totalidade no PEP 589
- Seção de artigo sobre tipos e
TypedDict
em Python 3.8 por Python real
typing-extensions
pacote a ser usado TypedDict
no Python 3.5, 3.6
typing
internos não estão documentados e a parte que está documentada é mal.