No recém-lançado Python 3.8, há uma nova anotação de tipo typing.TypedDict
. Sua documentação menciona que
As informações de tipo para introspecção podem ser acessadas via
Point2D.__annotations__
ePoint2D.__total__
. [....]
Embora __annotations__
seja bem conhecido, tendo sido introduzido no PEP 3107 , não consigo encontrar nenhuma informação sobre __total__
. Alguém poderia explicar seu significado e, se possível, vincular-se a fontes autorizadas?
python
python-3.x
python-typing
Antti Haapala
fonte
fonte
typing
internos não estão documentados e a parte que está documentada é mal.Respostas:
Suponho que o
__total__
campo signifique se as instâncias devem ser completas (o padrão) ou não (todos os campos são opcionais). Comecei minha pesquisa no PEP 589 , que introduziuTypedDict
e descreve a totalidade como tal. Ele usou umtotal
argumento, no qual faria sentido renomear o estilo dunder para aclass
sintaxe. No entanto, não encontrei quando essa renomeação ocorreu.Examinando o MyPy, que é o verificador real de tipos que se preocupa com essas anotações, há documentação
TypedDict
e totalidade semelhantes , mas novamente nenhuma referência à sintaxe do dunder. Cavar na sua implementação levou a mais confusão, comoTypedDictType
no types.py não tem um campo total, mas separadoitems
erequired_keys
. A totalidade implicaria isso,items.keys()==required_keys
mas a implementação faz suposições diferentes, comocan_be_false
confiaritems
sozinho.total=False
em princípio, significa querequired_keys
está vazio.A fonte CPython para _TypedDictMeta pelo menos revela que o
total
argumento e o__total__
dunder são o mesmo, embora a fonte se descrevaTypedDict
como "possa ser adicionada em breve".fonte
can_be_false
coisa seja um bug do MyPy, possivelmente relacionado a não ter planejado ter campos opcionais desde o início.TypedDict
foi aceito no Python 3.8 via PEP 589 . No Python, parece__total__
ser um sinalizador booleano definido comoTrue
padrão: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 à novatotal
palavra-chave introduzida no Python 3.8 :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:
Demo
Se uma chave estiver faltando, o mypy irá reclamar na linha de comando:
A configuração
total=False
permite chaves opcionais:Veja também
TypedDict
em Python 3.8 por Python realtyping-extensions
pacote a ser usadoTypedDict
no Python 3.5, 3.6fonte