Pergunta

Eu tenho certeza que este é um assunto que está na mente da maioria dos desenvolvedores de Python, considerando que Python 3 está saindo em breve. Algumas perguntas para obter indo na direção certa:

  1. Você vai ter uma versão Python 2 e 3 deve ser mantida ao mesmo tempo ou se você simplesmente tem uma versão python 3, uma vez que está acabado?

    • Você já começou ou plano de começar em breve? Ou será que você está pensando em esperar até a versão final sai para entrar em pleno andamento?
Foi útil?

Solução

Aqui está o plano geral para a torcida. I foi originalmente indo ao blogue isto, mas depois pensei: por que blog sobre isso quando eu poderia começar pontos para ele

  1. Aguarde até que cuidados alguém.

    Agora, ninguém tem Python 3. Nós não vamos gastar um monte de esforço até que pelo menos um usuário real chegou à frente e disse "eu preciso de apoio Python 3.0", e tem uma boa razão para isso, além de o fato de que 3,0 parece brilhante.

  2. Aguarde até que nossas dependências migraram.

    Um grande sistema como o trançado tem um número de dependências. Para começar, o nosso incluem:

    Alguns destes projectos têm o seu próprio conjunto de dependências por isso vamos ter que esperar para aqueles também.

  3. Aguarde até que cuidados alguém suficientes para ajuda .

    Existem, caridosamente, 5 pessoas que trabalham na torcida - e digo "caridade", porque isso é me contar, e eu não cometi em meses. Temos mais de 1000 bilhetes abertos agora, e seria bom para realmente corrigir alguns daqueles - corrigir bugs, adicionar recursos, e geralmente fazem trançado um produto melhor em seu próprio direito -. antes de gastar tempo em começá-lo portado para um substancialmente nova versão da linguagem

    Este potencialmente inclui patrocinadores suficiente carinho para pagar para nós a fazê-lo, mas espero que haverá um afluxo de voluntários que se preocupam com o apoio 3.0 e quero ajudar a mover a comunidade para a frente.

  4. conselhos de Acompanhamento Guido.

    Este meios não vamos mudar a nossa API incompatibly , e vamos seguir o desenvolvimento de transição diretrizes que Guido publicado no ano passado. Que começa com ter testes de unidade, e correndo a ferramenta conversão 2to3 sobre a base de código torcida.

  5. Relatório bugs contra e patches de arquivo para, a ferramenta 2to3 .

    Quando chegarmos ao ponto em que estamos realmente utilizá-lo, eu antecipo que haverá um monte de problemas com o funcionamento de 2to3 no futuro. Executá-lo ao longo do trançado agora leva um tempo extremamente longo e (última vez que verifiquei, o que era um bom tempo atrás) não pode analisar alguns dos arquivos no repositório Torcido, de modo a saída resultante não vai importar. Eu acho que vai ter que ser uma boa quantidade de histórias de sucesso de pequenos projectos e um monte de martelar na ferramenta antes que ele irá realmente funcionar para nós.

    No entanto, a equipe de desenvolvimento Python tem sido muito útil para responder aos nossos relatórios de bugs, e as respostas iniciais para estes problemas têm sido encorajadores, por isso espero que todos esses problemas serão resolvidos no tempo.

  6. Manter 2.x compatibilidade para seanos veral.

    Agora, Torcido suporta python 2,3 a 2,5. Atualmente, estamos trabalhando em 2.6 suporte (que vamos, obviamente, tem que terminar antes do 3.0!). Nosso plano é que revisar nossas versões suportadas do Python com base nas versões de longo prazo apoiada de Ubuntu - versão 8.04, que inclui Python 2.5, serão apoiados até 2013. de acordo com o conselho de Guido teremos de perder o suporte para 2.5 a fim de apoiar 3.0, mas eu estou esperando que nós possamos encontrar uma maneira de contornar isso (que são bastante criativo com hacks versão de compatibilidade).

    Então, estamos planejando para apoiar Python 2.5, pelo menos até 2013. Em dois anos, o Ubuntu irá lançar outra versão de longo prazo com suporte do Ubuntu: se eles ainda existem, e permanecer na programação, que será 10,04. Pessoalmente, eu estou supondo que esta será lançado com Python 2.x, talvez python 2.8, como /usr/bin/python, porque há uma enorme quantidade de software Python empacotado com a distribuição e vai demorar muito tempo para atualizar tudo. Então, cinco anos a partir de então , em 2015, podemos começar a olhar para fim do suporte 2.x.

    Durante este período, vamos continuar a seguir o conselho de Guido sobre migração:. Correndo 2to3 sobre a nossa base de código 2.x, e modificar a base de código 2.x para manter seus testes passando em ambas as versões

    O resultado disto é que Python 3.x não será um source idioma para trançado até bem depois da minha 35º aniversário - será um tempo de execução de destino (e um conjunto de diretrizes e restrições) para o meu código python 2.x. Espero estar a escrever programas em Python 2.x para os próximos anos dez ou mais.

Então, esse é o plano. Eu estou esperando que ele acaba olhando laughably conservador em um ano ou mais; que a transição 3.x é fácil como torta, e todos atualiza rapidamente. Outras coisas podem acontecer, também: o 2.xe 3.x ramos poderiam convergir, alguém pode acabar escrevendo um 3to2 ou outro tempo de execução (PyPy vem à mente) pode permitir que para a execução 2.x e código 3.x no mesmo processo diretamente, tornando o nosso processo de conversão mais fácil.

Por enquanto, no entanto, estamos assumindo que, por muitos anos, teremos pessoas com grandes bases de código que está mantendo (ou pessoas escrevendo novo código que querem usar outros bibliotecas que ainda não foram migrados) que ainda querem novos recursos e correções de bugs na torcida. Muito em breve eu espero que também terá os usuários mais exigentes que querem usar trançado em python 3. Eu gostaria de fornecer todas essas pessoas com uma experiência positiva para o maior tempo possível.

Outras dicas

O projeto Django usa a biblioteca six para manter uma base de código que funciona simultaneamente em Python 2 e Python 3 ( blog ).

six faz isso fornecendo uma camada de compatibilidade que inteligentemente redireciona importações e funções para seus respectivos locais (assim como unificando outras mudanças incompatíveis).

vantagens óbvias:

  • Não há necessidade de ramos separados para Python 2 e Python 3
  • Nenhuma ferramenta de conversão, como 2to3.

A idéia principal do 2.6 é fornecer um caminho de migração para 3.0. Assim você pode usar from __future__ import X lentamente migrar uma característica de cada vez até chegar todos eles pregado para baixo e pode mover-se para 3.0. Muitos dos 3,0 características fluirá em 2.6, bem como, para que você possa fazer a abertura da língua menor gradualmente, em vez de ter que tudo migrar de uma vez.

No trabalho, pretendemos atualizar 2,5-2,6 primeiro. Então começamos permitindo 3,0 características lentamente um módulo de cada vez. Em algum momento toda uma sub-parte do sistema provavelmente estará pronto para 3.x.

O único problema são bibliotecas. Se uma biblioteca não é migrado, estamos presos com a antiga biblioteca. Mas estou bastante confiante de que teremos uma boa alternativa em tempo útil para essa parte.

Falando como um autor biblioteca:

Eu estou esperando a versão final para ser lançado. Minha crença, como o da maioria da comunidade Python, é que 2.x continuará a ser a versão dominante por um período de semanas ou meses. Isso de muito tempo para lançar um agradável, polido 3.x versão.

Eu vou estar mantendo 2.xe 3.x ramos separados. 2.x vai ser compatível com 2.4, por isso não posso usar um monte da sintaxe fantasia ou novos recursos do 2.6 / 3.0. Em contraste, o ramo 3.x irá usar cada um desses recursos que resulta em uma experiência melhor para o usuário. O conjunto de testes será modificado para que 2to3 vai trabalhar em cima dele, e eu vou manter os mesmos testes para ambos os ramos.

Apoio ambos

Eu queria fazer uma tentativa de converter a biblioteca BeautifulSoup de 3x para um projeto que estou trabalhando, mas eu posso ver como seria uma dor de manter dois ramos diferentes do código.

O modelo atual para lidar com este incluem:

  1. fazer uma mudança para o ramo 2x
  2. executar 2to3
  3. rezar para que ele faz a conversão corretamente na primeira vez
  4. executar o código
  5. executar testes de unidade para verificar se tudo funciona
  6. copiar a saída para o ramo 3x

Este modelo funciona, mas IMHO é uma porcaria. Para cada mudança / liberar você tem que passar por essas etapas :: suspiro ::. Além disso, ele desencoraja desenvolvedores de estender o ramo 3x com novos recursos que só podem ser suportados no Py3k porque você ainda está essencialmente alvejando todo o código para 2x.

A solução ... uso um pré-processador

Uma vez que eu não poderia encontrar um pré-processador decente c-style com as directivas #define e #ifdef para python Eu escrevi um.

É chamado pypreprocessor e pode ser encontrado na PyPI

Essencialmente, o que você faz é:

  1. importação pypreprocessor
  2. detectar qual versão do python o script está sendo executado em
  3. definir um 'definir' na pré-processador para a versão (ex 'python2' ou 'python3')
  4. pitada '#ifdef python2' e '#ifdef python3' directivas onde o código é a versão específica
  5. executar o código

É isso. Agora ele vai trabalhar tanto em 2x e 3x. Se você está preocupado com a queda de desempenho adicionado da execução de um pré-processador há também um modo que irá retirar todos os metadados e de saída da fonte processado-post para um arquivo.

O melhor de tudo ... você só tem que fazer a conversão 2to3 uma vez.

Aqui está um exemplo do trabalho:

#!/usr/bin/env python
# py2and3.py

import sys
from pypreprocessor import pypreprocessor

#exclude
if sys.version[:3].split('.')[0] == '2':
    pypreprocessor.defines.append('python2')
if sys.version[:3].split('.')[0] == '3':
    pypreprocessor.defines.append('python3')

pypreprocessor.parse()
#endexclude
#ifdef python2
print('You are using Python 2x')
#ifdef python3
print('You are using python 3x')
#else
print('Python version not supported')
#endif

Estes são os resultados no terminal:

 python py2and3.py
 >>>You are using Python 2x 
 python3 py2and3.py
 >>>You are using python 3x

Se você quer saída para um arquivo e fazer arquivo de origem específico da versão limpa, sem meta-dados extra, adicionar essas duas linhas em algum lugar antes da instrução pypreprocessor.parse ():

pypreprocessor.output = outputFileName.py
pypreprocessor.removeMeta = True

Depois:

python py2and3.py

Irá criar um arquivo chamado outputFileName.py que é python 2x específico com nenhum metadado extra.

python3 py2and3.py

Irá criar um arquivo chamado outputFileName.py que é python 3x específico com nenhum metadado extra.

Para documentação e mais exemplos veja confira pypreprocessor em GoogleCode .

Eu sinceramente espero que isso ajude. Eu amo escrever código em python e eu espero para ver o progresso apoio para o reino 3x mais cedo possível. Eu odeio ver a linguagem não progridem. Especialmente, uma vez que a versão 3x resolve um monte de WTFs destaque e faz o olhar sintaxe um pouco mais amigável para usuários migrando de outras línguas.

A documentação neste momento é completa, mas não extensa. Vou tentar obter o wiki com algumas informações mais extensa em breve.

Update:

Embora eu projetei pypreprocessor especificamente para resolver este problema, ele não funciona porque o lexer faz verificação de sintaxe em todo o código antes de qualquer código é executado.

Se python teve verdadeiro C pré-processador apoio directiva permitiria aos desenvolvedores escrever tanto código Python2X e python3k lado a lado no mesmo arquivo, mas devido à má reputação do C pré-processador (abuso de substituição de macro para mudar idioma palavras-chave) Eu não vejo suporte C pré-processador legítimo a ser adicionado a python qualquer momento em breve.

O Zope Toolkit tem sido um progresso lento a 3 apoio Python. Lento, principalmente porque muitas destas bibliotecas são muito complexas.

Para a maioria das bibliotecas eu uso 2to3. Algumas bibliotecas fazer fazer sem ele, porque eles são simples ou ter a maior parte do código em um C-extensão. zc.buildout, que é um pacote relacionado, será executado o mesmo código sem 2to3 para Python 2 e 3 apoio.

porta do ZTK para Python 3, porque muitas outras bibliotecas e frameworks dependem dele, como trançado eo quadro Pyramid.

Alguns dos meus código 2.x mais complexo vai ficar em 2.5 ou 2.6. Estou me mudando para 3.0 para todos os novos desenvolvimentos, uma vez algumas das bibliotecas 3o partido Eu uso muitas vezes foram atualizados para 3.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top