Data Classes do Python 3.7
Prometo escrever um post sobre as novidades do release 3.7 quando sair a versão oficial (prevista para Julho). Neste post vou adiantar alguma informação sobre uma nova feature chamada Data Classes que estudei para fazer uma apresentação no encontro mensal do Grupy-SP de fevereiro: o release 3.7 entrou em beta teste e portanto está em feature-freeze, ou seja, não deve mudar nada até o lançamento.
Pra que serve?
Se você costuma usar named tuples ou o módulo attrs, Data Classes fica mais ou menos no meio: é um pouco mais elaborado que named tuples e também mais simples que attrs. Para mostrar o caso de uso típico vou começar falando de objetos em Javascript. O literal para objetos em Javascript é bem parecido com o literal para dicionários em Python, mas tem uma feature intessante: você pode acessar as propriedades do objeto usando a notação instância["propriedade"]
ou instancia.propriedade
. Não sei vocês, mas acho isso super conveniente:
Em dicionários Python estamos restritos a instância["propriedade"]
ou instancia.get("propriedade")
, não sei qual dos dois é mais chato de teclar e poucos editores tem auto-complete para chaves de dicionário. Nesse caso, muita gente acaba escrevendo uma classe:
Comparando com Javascript {x: 1, y: 2}
é muito mais coisa para digitar, e a representação default não é lá grande coisa. Pra melhorar um pouco precisamos implementar também o método __repr__
:
Outros métodos que você pode querer implementar são__eq__
e __hash__
. Ai é que entram as data classes para eliminar todo esse boilerplate:
Pronto, o decorador @dataclasses
faz todo o resto pra você implementando __init__
, __repr__
, __str__
e um monte de outros "dunder" methods. Pode ser um pouco mais chato de digitar do que o literal de objetos em Javascript mas também tem algumas vantagens: a herança funciona como esperado.
Por que não simplesmente usar named tuples?
Com named tuples a definição fica ainda mais concisa e a representação default é legal mas se você tentar herdar de uma named tuple vai ver que é um daqueles momentos WAT em Python:
Você pode se sentir tentado a implementar __new__
mas acredite, você não quer entrar nessa toca de coelho: cada coisa esquisita que você corrige parece ter algum outro efeito colateral. Já com data classes tudo funciona como esperado:
Conclusão
Tem outras coisas interessantes nas data classes do Python 3.7 como a possibilidade de estipular valores default ou tornar as instâncias imutáveis (de forma que possam ser utilizadas como chaves de dicionário).
Para ver todas estas possibilidades beba direto na fonte consultando a PEP 557.