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:
- faites un changement à l'2x branche
- exécuter 2to3
- prions pour que la conversion s'effectue correctement la première fois
- exécuter le code
- exécuter des tests unitaires pour vérifier que tout fonctionne
- 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:
- importation pypreprocessor
- détecter la version de python que le script est en cours d'exécution dans
- définir un "définir" dans le pré-processeur pour la version (ex "python2" ou "python3')
- saupoudrer '#ifdef python2' et '#ifdef python3 " directives d'où le code est spécifique à une version
- 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.