Un de mes objectifs pour la prochaine version de Bristoledit est de pouvoir faire fonctionner l'éditeur aussi bien avec Python 2 que Python 3, voir même avec Pypy. Pourquoi ? Parce que Python 3, c'est l'avenir, le language est plus propre, plus agréable. Mais Python 2 reste encore très utilisé, et certaines bibliothèques (PyGTK) ne sont pas encore compatibles avec la version 3. Et Pypy, parce qu'avoir un interpréteur plus rapide que CPython, c'est la classe.

La manière traditionnelle pour avoir du code compatible entre Python 2 et Python 3 consiste à l'écrire en Python 2, puis à le convertir avec 2to3. Mais c'est tout de même relativement contraignant.

Aussi, je me suis dit que j'allais essayer d'avoir un code fonctionnel avec ces trois interpréteurs, sans traduction préalable, comme l'a fait Ryan Kelly pour PyEnchant.

Voici donc upy (pour universal python), un module qui permet de s'approcher de la sémantique de Python 3, mais avec du code fonctionnel quelque soit l'interpréteur.

Exemples :

from upy import *    # oui, normalement ça ne se fait pas. Ici, on écrase sans
# discuter les fonctions internes de Python 2 par des
# équivalents de Python 3

spam = str() # hop, une chaîne *unicode* vide
eggs = bytes() # hop, un tableau d'octets (attention cependant, la
# sémantique de eggs[i] n'est pas la même entre Python 2
# et Python 3

spamspam = u('Hêllo Wôrld') # u("") remplace u"", qui n'est valide qu'en
# Python 2
eggseggs = b("que d'octets !") # de même, b("") remplace le b"" de Python 3

uprint(spamspam) # le print de Python 2 ne se remplace pas facilement...
# uprint a la même sémantique que le print de Python 3
# il est possible d'importer du __future__ le print de
# Python 3 dans Python 2.6, mais on perd alors la
# compatibilité avec Python 2.5 et Pypy.

D'autres objets sont disponibles, voir la documentation du module. Il est aussi possible de ne pas écraser les versions originelles, et d'utiliser juste des ustr, ubytes, etc.

Maintenant, il n'y a plus qu'à réécrire Bristoledit pour profiter de tout ça !