Data Classes do Python 3.7

Paulo Scardine
Python Weekly Brazil
2 min readFeb 14, 2018

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:

Usar herança com named tuples é 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.

--

--