Portando para o Python 3

Em 2008 foi lançada a versão 3 da linguagem Python com diversas funcionalidades novas, mas parcialmente incompatível com os programas feitos para Python 2. Nestes 5 anos, a adoção ainda não é grande exatamente por causa deste fator e porque normalmente as pessoas não querem ter que aprender os detalhes que são necessários para essa mudança.

Hoje em dia existem diversas ferramentas que permitem desenvolver software que seja compatível com as duas versões, mas para isso é preciso entender o que mudou e adaptar. Este é será um guia rápido com dicas para migrar para Python 3 e aproveitar as melhorias que essa nova versão traz.

Parte I – Quando migrar

Por causa da incompatibilidade que existe, muitos desenvolvedores não podem começar a migração pois dependem de diversas bibliotecas que ainda não fizeram sua parte. Hoje em dia, grande parte das bibliotecas mais importantes da linguagem já são compatíveis com Python 3, o que torna bem mais plausível converter seu código.

Para computação númerica NumPy, SciPy, Matplotlib, IPython e Pandas são as ferramentas mais importantes e todas já foram portadas. Em desenvolvimento web, os frameworks mais importantes – Pyramid e Django – também funcionam perfeitamente em Python 3. Para criar GUI’s, PyQT4 e Tkinter podem ser utilizados sem problemas.

– O que falta então?

Normalmente são as pequenas bibliotecas que fazem trabalhos específicos e que já não são atualizadas há anos. Inclusive, este é um bom momento para se livrar delas. Procure no PyPI por algo semelhante que resolva seu problema e que seja compatível com Python 3.

– E se eu não quiser migrar?

Aproximadamente em 2017, o suporte para Python 2 vai terminar e este já não recebe novas funcionalidades desde 2010, com o lançamento do Python 2.7. Atualmente, só atualizações de segurança e outros bugs sérios são lançadas. Além disso, em breve o Python 3 será instalado por padrão na maioria das distribuições Linux, como já o é no Arch Linux e será no Ubuntu 13.04 ou 13.10.

– Mas mexer em código antigo que já funciona há anos é difícil…

Sim, isso é um grande impedimento. O ideal é começar a aprender com código novo e, quando surgir a oportunidade (ou necessidade) modificar os códigos antigos. A dica é, comece pelas suas bibliotecas para depois partir para as aplicações.

– Por onde eu começo?

O meu texto preferido sobre o tema é Dive into Python 3 que traz todos os detalhes sobre a linguagem e mostra o caso de migração de um software real. Aqui só faço uma introdução sobre o tema.

Independente de querer migrar ou não o seu código, é interessante conhecer o Python 3 e passar suportá-lo em código novo. Mesmo que você esteja escrevendo código com bibliotecas obsoletas, existem boas práticas que deixam permitem desenvolver já pensando no futuro.

Parte II – O que mudou

As mudanças mais importantes para a linguagem foram: uso de Unicode por padrão, substituição de algumas partes da sintaxe que eram confusas e bibliotecas renomeadas.

Provavelmente, a mudança mais marcante do Python 3 pela incompatibilidade gerada é o uso de strings Unicode por padrão, fazendo uma separação explícita entre Bytes e Texto. Sem entrar em detalhes, o Unicode permite o uso de caracteres em qualquer alfabeto de forma que você não se preocupe com a forma com que ele está armazenado, ao contrário da strings de bytes, onde um caráter pode ser formado por 1 ou mais bytes e pode ter diferentes representações dependendo da codificação utilizada.

A melhor prática para lidar com texto é o sanduíche Unicode: Você recebe bytes, transforma em texto assim que chegam, trabalha despreocupadamente com esse texto e, por fim, gera bytes para enviar para outro lugar. Isso pode ser feito em qualquer linguagem com suporte a Unicode, incluindo Python 2, mas com o uso de strings Unicode por padrão, o Python 3 facilita esse procedimento.

Se quiser se aprofundar no tema, veja essa apresentação: Unipain.

Outras mudanças de sintaxe são: “print” e “exec” agora são funções, divisão de números agora é em ponto flutuante mesmo para inteiros e existe o operador “//” para divisão inteira, capturar exceções usam a palavra-chave “as” no lugar de uma vírgula para a variável que vai receber o erro, identação deve ser consistente com o uso de espaços ou tabs, comparação de objetos de tipos diferentes gera exceções quando não fizer sentido dizer que um é maior que o outro (exemplo: strings e números), entre outros.

Conhecendo os possíveis problemas, é muito mais fácil fazer a migração. Um projeto pequeno (até umas 7000 linhas de código) pode ser convertido em algumas poucas horas.

 

Parte III – Como migrar

Antes de começar a mudar o seu código, é bom pensar se você quer:

  1. Migrar totalmente para essa nova versão para aproveitar todas as novas funcionalidades;
  2. Arrumar o código em Python 2 e usar a ferramenta 2to3 para converter o código automaticamente durante a instalação;
  3. Escrever código compatível com as duas versões.

Atualmente, grande parte das bibliotecas que funcionam em Python 3 utilizam essa terceira opção sendo também a minha preferida. Em alguns casos, também escrevo código somente para Python 3 (normalmente código para uso pessoal) pois é mais rápido e, muitas vezes, mais fácil. Fazer um código escrito para Python 3 ser compatível com Python 2 é muito mais fácil que o inverso.

Independente da escolha, as três opções para portar seu código começam com o uso da ferramenta 2to3. Basicamente, ela corrige os casos mais simples de incompatibilidade e gera um código com sintaxe compatível com Python 3 apenas. Feito isso, você deve executar seus testes e ver o que ainda está errado.

Para a opção 2 acima, você vai corrigindo os problemas no código inicial em Python 2 e sempre usando a ferramenta para converter e verificando novamente no Python 3. Nas outras duas opções, você passa a a corrigir os problemas diretamente no código novo, sendo que na terceira opção é necessário testar sempre no Python 2.

Normalmente, a escolha mais saudável para implementar a opção 3 é manter a compatibilidade com apenas as versões 2.6 e 2.7 além das versões 3.x do Python. Isso se dá porque várias funcionalidades novas foram portadas para elas. Se existe necessidade de dar suporte aos dinossauros que ainda usam CentOS 5 ou RedHat 5 que só trabalham com Python 2.4, a solução viável é a segunda.

Note que em todos os casos é importante que seu projeto use testes automatizados. Além de ser uma excelente prática de programação, testes automatizados fazem com que uma mudança aparentemente simples que pode causar problema em um lugar diferente seja verificada rapidamente. Antes de começar a migrar, veja se os testes estão OK ou, se não existirem, crie (ao menos para as partes mais importantes da aplicação).

Por fim, para a escolha da opção 3, existem diversas bibliotecas que fazer a ponte entre as duas versões do Python, deixando o desenvolvimento bem homogêneo. Uma das mais utilizadas é a six.

python-logo-glassy

Comments on this entry are closed.