Fornecendo suporte a várias versões do Python#

Status da página:

Obsoleto

Última revisão:

2014-12-24

FIXME

Useful projects/resources to reference:

- DONE six
- DONE python-future (http://python-future.org)
- tox
- DONE Travis and Shining Panda CI (Shining Panda no longer available)
- DONE Appveyor
- DONE Ned Batchelder's "What's in Which Python"
  - http://nedbatchelder.com/blog/201310/whats_in_which_python_3.html
    - http://nedbatchelder.com/blog/201109/whats_in_which_python.html
- Lennart Regebro's "Porting to Python 3"
- Greg Hewgill's script to identify the minimum version of Python
  required to run a particular script:
  https://github.com/ghewgill/pyqver
- the Python 3 porting how to in the main docs
- cross reference to the stable ABI discussion
  in the binary extensions topic (once that exists)
- mention version classifiers for distribution metadata

Além do trabalho necessário para criar um pacote Python, geralmente é necessário que o pacote esteja disponível em diferentes versões do Python. Diferentes versões Python podem conter diferentes (ou renomeados) pacotes de biblioteca padrão, e as alterações entre Python versões 2.x e 3.x incluem alterações na sintaxe da linguagem.

Executados manualmente, todos os testes necessários para garantir que o pacote funcione corretamente em todas as versões alvo Python (e sistemas operacionais!) podem consumir muito tempo. Felizmente, várias ferramentas estão disponíveis para lidar com isso, e elas serão brevemente discutidas aqui.

Testes automatizados e integração contínua#

Vários serviços hospedados para testes automatizados estão disponíveis. Esses serviços normalmente irão monitorar seu repositório de código-fonte (por exemplo, no GitHub ou Bitbucket) e executar um conjunto de testes do seu projeto toda vez que um novo commit é feito.

Esses serviços também oferecem facilidades para executar o conjunto de testes do seu projeto em várias versões do Python, fornecendo um feedback rápido sobre se o código funcionará, sem que o desenvolvedor tenha que realizar esses testes por conta própria.

A Wikipédia tem uma extensa comparação de muitos sistemas de integração contínua. Existem dois serviços hospedados que, quando usados em conjunto, fornecem testes automatizados no Linux, Mac e Windows:

  • Travis CI fornece um ambiente Linux e macOS. O ambiente Linux é Ubuntu 12.04 LTS Server Edition de 64 bits, enquanto o macOS é 10.9.2 no momento da escrita.

  • Appveyor fornece um ambiente Windows (Windows Server 2012).

TODO Either link to or provide example .yml files for these two
services.

TODO How do we keep the Travis Linux and macOS versions up-to-date in this
document?

Tanto o Travis CI quanto o Appveyor exigem um arquivo formatado em YAML como especificação para as instruções de teste. Se algum teste falhar, o log de saída para essa configuração específica pode ser inspecionado.

Para projetos Python que devem ser implantados em Python 2 e 3 com uma estratégia de única fonte, há uma série de opções.

Ferramentas para pacotes Python de única fonte#

six é uma ferramenta desenvolvida por Benjamin Peterson para resolver as diferenças entre Python 2 e Python 3. O pacote six desfrutou de uso generalizado e pode ser considerado como uma maneira confiável de escrever um módulo Python de fonte única que pode ser usado em Python 2 e 3. O módulo six pode ser usado a partir de Python 2.5. Uma ferramenta chamada modernize, desenvolvida por Armin Ronacher, pode ser usada para aplicar automaticamente as modificações de código fornecidas por six.

Semelhante a six, python-future é um pacote que fornece uma camada de compatibilidade entre o código-fonte de Python 2 e Python 3; no entanto, ao contrário do six, este pacote visa fornecer interoperabilidade entre Python 2 e Python 3 com uma sintaxe de linguagem que corresponda a uma das duas versões Python: pode-se usar

  • um módulo Python 2 (por sintaxe) em um projeto Python 3.

  • um módulo Python 3 (por sintaxe) em um projeto Python 3.

Por causa da bidirecionalidade, python-future oferece um caminho para converter um pacote Python 2 na sintaxe de Python 3, módulo por módulo. No entanto, em contraste com six, python-future é compatível apenas com Python 2.6. Semelhante a modernize para six, python-future vem com dois scripts chamados futurize e pasteurize que podem ser aplicados a um módulo Python 2 ou um módulo Python 3 respectivamente.

O uso de six ou python-future adiciona uma dependência adicional de tempo de execução ao seu pacote: com python-future, o script futurize pode ser chamado com a opção --stage1 para aplicar apenas as mudanças que Python 2.6+ já fornece compatibilidade com versões futuras para Python 3. Quaisquer problemas de compatibilidade remanescentes exigiriam alterações manuais.

O que há em cada Python?#

Ned Batchelder fornece uma lista de alterações em cada versão Python para Python 2, Python 3.0-3.3 e Python 3.4-3.6. Essas listas podem ser usadas para verificar se quaisquer mudanças entre as versões Python podem afetar seu pacote.

TODO These lists should be reproduced here (with permission).

TODO The py3 list should be updated to include 3.4