TypedDict foi apresentado na PEP-589 e introduzido no Python 3.8. É usado principalmente para criar anotações de tipo para dicionários.
- Em vez de usar
dataclass ou pydantic para representar dados do tipo “registro”, o TypedDict aproveita a flexibilidade dos dicionários e é vantajoso em situações em que campos podem estar ausentes.
- Por exemplo, definir uma classe
Movie e atribuir ao valor movie um dicionário do tipo Movie
class Movie(TypedDict):
title: str
movie: Movie = {"title": "Avatar"}
Não totalidade
TypedDict oferece suporte ao conceito de não totalidade, que indica que campos podem estar ausentes. Isso é útil ao implementar endpoints HTTP PATCH.
dataclass não tem esse conceito de campo ausente, então pode ficar algo estranho.
- Em
TypedDict, é possível lidar com campos ausentes de forma flexível definindo total=False.
- A PEP-655 permite marcar campos individuais com
Required e NotRequired.
Usando TypedDict com **kwargs
- A PEP-692 permite usar
TypedDict para tipar argumentos nomeados variáveis.
- Usar
TypedDict pode fazer o código parecer verboso, mas é útil quando ele é reutilizado em várias definições de função.
- Em conjunto com a não totalidade, ele mostra ainda mais seus pontos fortes.
- Como em cenários de personalização de
pytest.fixture, em que alguns argumentos são repassados como estão.
- É possível implementar um comportamento semelhante com valores sentinela, mas as anotações de tipo podem ficar estranhas.
Usando TypedDict para injeção de dependência
- A PEP-692 também permite verificação de tipos em chamadas de função que usam
TypedDict.
- Isso é útil quando muitos recursos compartilham parte das dependências.
- Define-se um
TypedDict semelhante à união dos kwargs de todos os recursos.
- Depois de reescrever os recursos para aceitarem argumentos arbitrários, faz-se a injeção de dependência com
TypedDict.
- O sistema de tipos permite verificar erros ou ausências de argumentos durante a injeção de dependência.
- Alterar a assinatura dos recursos não é o ideal, mas ainda é uma mudança menor do que adotar um framework de injeção de dependência.
- Muitos frameworks não oferecem suporte a verificação estática de tipos.
Recursos futuros
- A PEP-728 permitirá definir o tipo de itens adicionais e criar dicionários fechados que não aceitam itens extras.
- Isso ajuda a definir tipos de registro com mais precisão.
- A PEP-705 permitirá marcar itens como somente leitura (dependendo do momento da publicação, isso talvez já tenha sido lançado).
- Isso trata situações em que podem surgir problemas causados por mutação potencial (remoção) entre diferentes
TypedDict que intuitivamente deveriam ser compatíveis.
Resumo do GN⁺
TypedDict é vantajoso em situações em que campos podem estar ausentes, aproveitando a flexibilidade dos dicionários.
TypedDict oferece uma opção mais flexível do que outras estruturas de dados, como dataclass ou pydantic.
- Escolha a ferramenta adequada ao domínio, mas vale a pena ter em mente as vantagens de
TypedDict.
2 comentários
Se os dados costumam chegar de fora em formato JSON ou ser exportados com frequência para fora do Python, vale a pena usar
TypedDict; caso contrário, recomendo usardataclassestruturada ouNamedTuple.Comentários no Hacker News
Pessoas que preferem tipagem dinâmica estão percebendo cada vez mais a importância dos sistemas de tipos
Motivos para usar
dataclass(slots=True)em vez deTypedDict.foobarem vez de["foobar"]pesa menos no pulsoSem um sistema que imponha tipos,
TypedDictnão cumpre nenhum papelPydanticO título "thank you think" soa excessivamente rude
O significado de "None" na frase sobre assinatura não está claro
Experiência pessoal com
TypedDictTypedDictpara anotar dicts e melhorar a legibilidade do códigoA funcionalidade de
TypedDicté boa, mas a sintaxe de declaração é complicada