52 votes

Comment envisagez-vous sur la gestion de la migration vers Python 3?

Je suis sûr que c'est un sujet qui est sur la plupart des développeurs python' esprits considérant que Python 3 est à venir bientôt. Quelques questions pour nous faire aller dans la bonne direction:

  1. Aurez-vous un python 2 et python 3 de la version à être maintenu en parallèle ou allez-vous simplement d'avoir un python version 3 une fois que c'est fini?

  2. Avez-vous déjà commencé ou d'un plan de départ rapidement? Ou prévoyez-vous d'attendre jusqu'à la version finale vient d'obtenir en plein essor?

90voto

Glyph Points 17756

Voici le plan général de Tordu. J'ai été à l'origine de ce blog, mais ensuite j'ai pensé: pourquoi un blog à ce sujet lorsque j'ai pu obtenir des points pour cela?

  1. Attendre jusqu'à ce que quelqu'un se soucie.

    Maintenant, personne n'a de Python 3. Nous n'allons pas dépenser beaucoup d'efforts jusqu'à ce qu'au moins un utilisateur réel est venu en avant et dit "j'ai besoin de Python 3.0 support", et a une bonne raison pour cela hormis le fait que le 3.0 semble brillant.

  2. Attendre jusqu'à ce que nos dépendances ont migré.

    Un système comme le Tordu a un certain nombre de dépendances. Pour commencer, la nôtre comprendre:

    Certains de ces projets ont leur propre tableau de dépendances, donc nous allons devoir attendre pour ceux aussi bien.

  3. Attendre jusqu'à ce que quelqu'un se soucie assez pour les aider.

    Il y a, charitablement, 5 personnes qui travaillent sur des Tordus - et je dis "charitablement" parce que de comptage de moi, et je n'ai pas commis dans le mois. Nous avons plus de 1000 billets ouverts maintenant, et il serait bien effectivement de résoudre certains de ceux - la correction de bugs, ajout de fonctionnalités, et généralement faire Tordu un meilleur produit dans son propre droit - avant de passer du temps sur l'obtenir portés à l'application d'une nouvelle version de la langue.

    Cela comprend les promoteurs de prendre soin assez pour payer pour nous de le faire, mais j'espère qu'il y aura un afflux de volontaires qui se soucient de la 3.0 et que vous voulez aider la communauté de l'avant.

  4. Suivez Guido de conseils.

    Cela signifie que nous n'allons pas changer notre API incompatibilité, et nous allons suivre la transition des orientations de développement qui Guido posté l'année dernière. Qui commence à avoir des tests unitaires, et l'exécution de la 2to3 outil de conversion de plus de la torsion de la base de code.

  5. Rapport de bogues et correctifs fichiers, le 2to3 outil.

    Lorsque nous arrivons au point où nous en sommes en fait en l'utilisant, je prévois qu'il y aura beaucoup de problèmes avec l'exécution de la 2to3 dans le futur. L'exécutant Torsadées maintenant prend un temps extrêmement long et (dernière j'ai vérifié, ce qui était tout à fait un, tout à l'heure) ne peut pas analyser un peu de fichiers dans la torsion du référentiel, de sorte que le résultat ne sera pas à l'importation. Je pense qu'il y aura à être une quantité d'histoires de succès auprès des petits projets et beaucoup de coups de marteau sur l'outil avant qu'il aura fait le travail pour nous.

    Cependant, le Python de l'équipe de développement a été très utile pour répondre à nos rapports de bug, et au début de réponses à ces problèmes ont été encourageants, donc je pense que tous ces problèmes seront résolus dans le temps.

  6. Maintenir 2.x compatibilité pour plusieurs années.

    Maintenant, Tordu prend en charge python 2.3 à 2.5. Actuellement, nous travaillons sur 2,6 soutien (que nous allons bien évidemment avant la fin de la 3.0!). Notre plan est de nous revoir nos versions de Python basé sur le long terme de la prise en charge des versions de Ubuntu - version 8.04, qui comprend Python 2.5, seront pris en charge jusqu'en 2013. Selon Guido de conseils, nous allons avoir besoin d'abandonner le support pour 2.5 afin de soutenir 3.0, mais je suis en espérant pouvoir trouver un moyen de contourner cela (nous sommes assez créatif avec la version de compatibilité de hacks).

    Nous sommes, donc, de la planification à l'appui de Python 2.5 au moins jusqu'en 2013. En deux ans, Ubuntu va sortir un autre à long terme pris en charge la version de Ubuntu: si elles existent encore, et de rester sur le calendrier, qui sera 10.04. Personnellement, je devine que ce sera livré avec Python 2.x, peut-être python 2.8, /usr/bin/python, car il ya une énorme quantité de Python logiciels livrés avec la distribution, et il faudra du temps pour mettre à jour tout ça. Donc, d'ici cinq ans , puis, en 2015, nous pouvons commencer à regarder déposer 2.x support.

    Au cours de cette période, nous continuerons à suivre de Guido de conseils à propos de la migration: l'exécution de 2to3 sur notre 2.x de la base de code, et modifiant les 2.x codebase pour garder ses tests de passage dans les deux versions.

    Le résultat de ceci est que Python 3.x ne sera pas une source de la langue pour les Tordus jusqu'à ce que bien après mon 35e anniversaire - il sera une cible d'exécution (et un ensemble de lignes directrices et restrictions) pour mon python 2.x code. J'attends d'être à l'écriture de programmes en Python 2.x pour les dix prochaines années.

Donc, c'est le plan. J'espère qu'il finit par regarder laughably conservateur dans un an ou deux; que le 3.x la transition est facile comme bonjour, et tout le monde rapidement mises à jour. D'autres choses peuvent se produire: le 2.x et 3.x branches pourraient converger, quelqu'un pourrait écrire un 3to2, ou à un autre moment de l'exécution (PyPy vient à l'esprit) pourrait permettre l'exécution de 2.x et 3.x code dans le même processus directement, faire de notre processus de conversion plus facile.

Pour le moment, cependant, nous supposons que, pendant de nombreuses années, nous allons avoir des gens avec de grandes bases de codes ils maintiennent la (ou les gens d'écrire du nouveau code qui veulent utiliser d'autres bibliothèques qui n'ont pas encore été migrés) qui veulent encore de nouvelles fonctionnalités et corrections de bugs dans l'Tordu. Assez vite je pense que nous auront également le saignement-bord les utilisateurs qui veulent utiliser Tordu sur python 3. J'aimerais fournir tous ces gens avec une expérience positive pour aussi longtemps que possible.

8voto

Thane Brimhall Points 1471

Le projet Django utilise la bibliothèque six afin de maintenir une base de code qui fonctionne simultanément sur Python 2 et Python 3 (billet de blog).

six , il fournit une couche de compatibilité qui intelligemment redirige les importations et les fonctions de leurs emplacements respectifs (ainsi que l'unification d'autres changements incompatibles).

Les avantages sont évidents:

  • Pas besoin de séparer les branches pour Python 2 et Python 3
  • Aucun des outils de conversion, tels que 2to3.

5voto

I GIVE CRAP ANSWERS Points 12429

L'idée principale de 2.6 est de fournir un chemin de migration à la version 3.0. Ainsi, vous pouvez utiliser from __future__ import X lentement la migration d'une fonctionnalité à la fois jusqu'à ce que vous obtenez tous cloué vers le bas et peut se déplacer à la version 3.0. De nombreux 3.0 caractéristiques d'écoulement dans la 2.6, de sorte que vous pouvez faire de la barrière de la langue les plus petits progressivement plutôt que d'avoir à migrer tout d'un coup.

Au travail, nous avons l'intention de mettre à niveau de 2,5 à 2,6 premier. Ensuite, nous commençons permettant 3.0 lentement, un module à la fois. À un certain moment, l'ensemble de la sous-partie du système sera probablement prêt pour les 3.x.

Le seul problème sont les bibliothèques. Si une bibliothèque est jamais migré, nous sommes coincés avec l'ancienne bibliothèque. Mais je suis assez confiant que nous allons obtenir une amende de remplacement dans les temps pour cette partie.

3voto

John Millikin Points 86775

S'exprimant en tant que bibliothèque de l'auteur:

Je suis en attente pour la version finale qui sera publié. Ma conviction, comme celui de la plupart de la communauté Python, c'est que 2.x continuera à être le dominant version pour une période de semaines ou de mois. C'est beaucoup de temps pour libérer un de gentil, poli 3.x version.

Je vais être le maintien de séparer les 2.x et 3.x branches. 2.x sera rétro-compatible avec l'article 2.4, donc je ne peux pas utiliser beaucoup de la fantaisie de syntaxe ou de nouvelles fonctionnalités 2.6 / 3.0. En revanche, la 3.x branche d'utiliser chacune de ces caractéristiques que les résultats dans une meilleure expérience pour l'utilisateur. La suite de test sera modifiée de sorte que 2to3 va travailler sur elle, et je vais maintenir les mêmes tests pour les deux branches.

3voto

Evan Plaice Points 5677

Soutien à la fois

J'ai voulu faire une tentative de conversion de la BeautifulSoup bibliothèque à 3x pour un projet que je suis en train de travailler sur mais je peux voir comment cela allait être une douleur à maintenir deux branches différentes de la code.

Le modèle actuel pour gérer cette situation:

  1. faites un changement à l'2x branche
  2. exécuter 2to3
  3. prions pour que la conversion s'effectue correctement la première fois
  4. exécuter le code
  5. exécuter des tests unitaires pour vérifier que tout fonctionne
  6. copier la sortie de la branche 3x

Ce modèle fonctionne mais à mon humble avis elle le suce. Pour chaque modification/release, vous devez passer par les étapes suivantes ::sigh::. De Plus, il décourage les développeurs de l'extension de l'3x branche avec de nouvelles fonctionnalités qui ne peuvent être pris en charge dans py3k parce que vous êtes encore essentiellement à cibler tout le code à 2x.

La solution... utiliser un préprocesseur

Puisque je ne pouvais pas trouver un travail décent c-style de préprocesseur #define et #ifdef directives pour python que j'ai écrit.

Il est appelé pypreprocessor et peut être trouvé dans la PYPI

Essentiellement, ce que vous avez à faire est de:

  1. importation pypreprocessor
  2. détecter la version de python que le script est en cours d'exécution dans
  3. définir un "définir" dans le pré-processeur pour la version (ex "python2" ou "python3')
  4. saupoudrer '#ifdef python2' et '#ifdef python3 " directives d'où le code est spécifique à une version
  5. exécuter le code

C'est tout. Maintenant, il va travailler dans les deux 2x et 3x. Si vous êtes inquiet au sujet ajoutée des performances de fonctionnement d'un préprocesseur il y a également un mode qui supprime toutes les métadonnées et de sortie de la post-traitées à la source dans un fichier.

Le meilleur de tous... vous n'avez qu'à faire le 2to3 de conversion une fois.

Voici un exemple:

#!/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

Ce sont les résultats dans le terminal:

 python py2and3.py
 >>>Vous êtes à l'aide de Python 2x 
 python3 py2and3.py
 >>>Vous êtes à l'aide de python 3x

Si vous souhaitez obtenir un fichier et de le rendre propre spécifique à la version du fichier source, sans aucun supplément de méta-données, ajoutez ces deux lignes quelque part avant que le pypreprocessor.parse ():

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

Alors:

python py2and3.py

Va créer un fichier appelé outputFileName.py qu'est python 2x spécifique, sans aucun supplément de métadonnées.

python3 py2and3.py

Va créer un fichier appelé outputFileName.py qu'est python 3x spécifique, sans aucun supplément de métadonnées.

Pour la documentation, et d'autres exemples voir découvrez pypreprocessor sur GoogleCode.

J'espère sincèrement que cela aidera. J'aime l'écriture de code en python et j'espère voir de soutenir les progrès dans le 3x domaine de l'asap. J'ai hate de voir la langue qui n'est pas le progrès. En particulier, depuis la version 3x résout beaucoup de la WTFs et rend la syntaxe de la regarder d'un peu plus favorable à la migration des utilisateurs à partir d'autres langues.

La documentation à ce stade est complet mais pas exhaustif. Je vais essayer d'obtenir le wiki avec un peu plus vaste d'informations bientôt.

Mise à jour:

Bien que j'ai conçu pypreprocessor spécifiquement pour résoudre ce problème, il ne fonctionne pas parce que l'analyseur lexical n'vérification de la syntaxe sur tout le code avant le code est exécuté.

Si python a vraiment des C directive de préprocesseur de soutien, il serait de permettre aux développeurs d'écrire à la fois python2x et python3k code, les uns à côté des autres dans le même fichier, mais en raison de la mauvaise réputation du préprocesseur C (abus de macro de remplacement pour changer de langue, mots-clés), je ne vois pas légitime du préprocesseur C support ajouté pour python tout moment bientôt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X