5 pontos por GN⁺ 2024-10-14 | 2 comentários | Compartilhar no WhatsApp
  • 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

 
ilotoki0804 2024-10-15

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 usar dataclass estruturada ou NamedTuple.

 
GN⁺ 2024-10-14
Comentários no Hacker News
  • Pessoas que preferem tipagem dinâmica estão percebendo cada vez mais a importância dos sistemas de tipos

    • Um sistema de tipos melhor é superior a um sistema de tipos pior
  • Motivos para usar dataclass(slots=True) em vez de TypedDict

    • O acesso a atributos é mais rápido, então o código fica mais rápido
    • Classes com slots usam menos RAM e exercem menos pressão sobre o cache L1, então o código fica mais rápido
    • Ao acessar atributos, usar .foobar em vez de ["foobar"] pesa menos no pulso
    • Se você digitar o nome de um atributo errado, ocorre um erro em tempo de execução
  • Sem um sistema que imponha tipos, TypedDict não cumpre nenhum papel

    • Mesmo que você armazene por engano um erro em uma propriedade anotada como string, o Python padrão não impede isso nem avisa
    • Para realmente impor tipos, é preciso usar ferramentas como Pydantic
  • O título "thank you think" soa excessivamente rude

    • "than i thought" fica mais agradável de ler
  • O significado de "None" na frase sobre assinatura não está claro

    • A gramática é complexa e difícil de entender
  • Experiência pessoal com TypedDict

    • Uso TypedDict para anotar dicts e melhorar a legibilidade do código
    • Isso reduziu o tempo gasto rastreando caminhos do código
    • É preciso escrever código melhor, mas em apps que usam muitos dicts, é uma boa solução
  • A funcionalidade de TypedDict é boa, mas a sintaxe de declaração é complicada