Profitant de mes vacances, j'ai testé Python 3000 (relire mon billet précédent sur Python 3000) pour voir si c'était utilisable. Autant ne pas se mentir : Python 3000 n'est pas prêt pour un usage quotidient. Selon moi, il y avait deux évolutions majeures et pénibles (pour les développeurs CPython) : fusion des types int et long, et la distinction entre les types bytes et str (anciennement str et unicode).

Types int et long

Pour les types int et long, en fait c'est le type long est renommé int et le l'ancien type int disparait. Pour les programmmeurs Python, on aura plus besoin d'écrire « isinstance(valeur, (int, long)) » pour vérifier si une valeur est un entier : « isinstance(valeur, int) » est désormais suffisant. Le suffixe L indiquant qu'un nombre est un entier long disparait également.

Pour la manipulation des entiers, Python 2.4 était déjà une avancée majeure. Si le résultat d'un calcul sur des entiers courts (int) dépasse la capacité d'un entier court, une conversion automatique en entier long est réalisée. Exemple : 2 ** 100 (où 2 et 100 sont des entiers courts) retourne 1267650600228229401496703205376L (type long).

Selon moi, Python va dans le bon sens : s'abstraire des limitations matérielles pour simplifier la vie au développeur. Python s'occupe tout seul des tâches pénibles : allouer la mémoire, faire des calculs sur les entiers longs, etc.

Types bytes et str

La distinction entre octet et caractère est un changement majeur dans Python. La compatibilité est brisée car le type bytes n'a plus les méthodes relatives à la manipulation de caractère telle que lower() et splitlines(), et un élément d'une chaîne bytes est un entier et non pas une sous-chaîne bytes. Exemple : b'xyz'[0] retourne 120. C'est d'ailleurs déroutant car le test « b'xyz'[0] == b'x' » est faux (120 == b'x' est faux). Il faut écrire explicitement « b'xyz'[0] == ord(b'x') » ou « b'xyz'[0] == 120 ».

La tâche est quasiment terminée : la branche subversion py3k-struni qui lui était dédiée a été fusionnée dans la branche py3k (branche python 3000 officielle). Il reste quelques bogues en particulier le module « email » qui est loin de fonctionnner en Python 3000.

J'ai aidé en corrigeant les modules ctypes, imghdr et sndhdr. Voir les commits 56838 (ctypes) et 56987 (imghdr et sndhdr). J'ai tenté avec beaucoup de mal de migrer le module email, mais comme il est assez gros et mélange allégrement octet et caractère, c'est loin d'être terminé. J'ai envoyé plusieurs emails à la liste de diffusion email-sig mais j'ai eu peu de retours.

Python 3000 ça sort quand ?

Une partie du wiki Python est dédiée à Python 3000 où on trouve en particulier les articles Py3kToDo (ce qu'il reste à faire dans Python 3000) et Py3kStrUniTests (tests unitaires cassés par la distinction bytes/str). La PEP 3100 (Miscellaneous Python 3.0 Plans) liste également toutes les tâches à faire pour Python 3000 avec leur état : [done] (fait), [UNLIKELY] (tâché en discussion), [no] (tâche refusée).