Liens connexes

Dépêche modérée par

Dépêche éditée par

: Python arrive en version 3.1

Posté par Victor STINNER (Jabber id, page perso, ). Modéré le 02 juillet 2009.
35
Le langage de programmation Python arrive dans une version 3.1 qui marque la maturation de la branche 3.x. Le passage à Unicode par défaut pour les chaînes de caractères dans Python 3.0 était source de nombreuses régressions au niveaux des performances. Celles-ci ont été gommées par la réécriture en C de la bibliothèques d'entrées/sorties (io) et l'optimisation des décodeurs des principaux jeux de caractères (ISO-8859-1, UTF-8 et UTF-16).

Les nouvelles fonctionnalités ne sont pas en reste. Le type « dictionnaire ordonné », qui conserve l'ordre d'insertion des éléments, souvent demandé par les utilisateurs, fait enfin son entrée dans le langage sous le nom « odict » (PEP 372: Adding an ordered dictionary to collections). L'instruction « with » accepte désormais d'écrire plusieurs contextes sur la même ligne, rendant contextlib.nested() désuet.

La seconde partie de la dépêche détaille les nouveautés de la version 3.1.

> Lire la suite (33 commentaires, moyenne: 3,5).   [dépêche : 6937 caractères]

Nouveautés de Python 3.1

Formatage des nombres flottants

Le type float de Python utilise le format IEEE 754 qui stocke les nombres en base 2. La conversion en une chaîne de caractères (base 10, décimal) surprend bon nombre de débutants à cause d'erreurs d'arrondis provenant du changement de base et de la précision limitée du format IEEE 754 (généralement 64 bits dont 52 pour la mantisse). Exemple : 0.1 * 2 (ou simplement « print repr(0.2) ») donne 0.20000000000000001 plutôt que 0.2 dans l'interprète interactif. Les raisons de ce problème, qui n'est pas spécifique à Python, sont détaillées dans la FAQ (Why are floating point calculations so inaccurate?).

Python 3.1 utilise désormais l'algorithme de David Gay pour utiliser une représentation (décimale) plus concise des nombres flottants. repr(1.1) renvoie simplement « 1.1 » au lieu de « 1.1000000000000001 ». Relire le ticket Use shorter float repr when possible pour voir le chemin parcouru pour obtenir ce résultat. Les développeurs se sont également inspirés du code source Tcl, en particulier de la fonction Tcl_PrintDouble.

Ce problème ne concernait pas str(nombre) qui utilise un algorithme différent.

Pour éviter les problèmes de conversion entre les bases 2 et 10, vous pouvez également utiliser le type Decimal qui travaille en base 10.

Séparateur des milliers et méthode bit_length

Au passage, le formatage des nombres entiers et flottants supporte désormais le séparateur des milliers (PEP 378: Format Specifier for Thousands Separator).

Le type int gagne la méthode bit_length() qui calcule le nombre de bits nécessaires pour représenter le nombre en binaire.

Format {}

Il n'est plus obligatoire de numéroter les arguments en utilisant la méthode format(). "{0} {1}!".format("Hello", "World") peut maintenant s'écrire simplement "{} {}!".format("Hello", "World")
importlib

Le nouveau module importlib offre une implémentation complète, portable, et écrite entièrement en Python de l'instruction import et de la fonction __import__. C'est une étape importante de la documentation des actions réalisées durant les imports, et va permettre de tester facilement de nouveaux comportements comme les imports paresseux ou des bacs à sable (pour la sécurité).

Amélioration du module unittest

Il est désormais possible d'ignorer certains tests en utilisant le décorateur : @unittest.skipUnless(condition, raison) De nombreuses méthodes ont également été ajoutées : assertSetEqual(), assertDictContainsSubset(), assertListEqual(), assertTupleEqual(), assertRaisesRegexp(), assertIsNone(), etc.

Ce n'est pas tout !

La liste des nouveautés est trop longue pour être détaillée ici. Je vous invite donc à consulter What's new in 3.1? pour en obtenir la liste complète.

Rappels sur la branche 3.x

Pour rappel, Python 3.0 a volontairement brisé la rétro-compatibilité, après une petite dizaine d'années passées en compagnie de la branche 2.x, pour améliorer la conception du langage. En particulier, les chaînes de caractères sont maintenant en Unicode par défaut, et les chaînes d'octets sont clairement séparées (la concaténation octets + caractères est interdite). Cette version était aussi l'occasion d'un dépoussiérage du langage (réorganisation de la bibliothèque standard, simplification du langage, etc.). Relire la dépêche sortie de Python 3.0 version finale pour les détails.

Pendant ce temps, la branche 2.x continue d'évoluer. Bien que la date de sortie de la version 2.7 ne soit pas encore fixée, on peut déjà dire que cette version contiendra bon nombre des nouveautés de Python 3.1 (se référer au document de travail What's New in Python 2.7)

La migration de Python 2 vers Python 3 est facilitée par le script 2to3. Tant que les bibliothèques majeures ne seront pas disponibles pour Python3, la majorité des applications continueront à utiliser Python2. Quelques projets expérimentaux de portage existent : setuptools, Django ou zope.interface. Tandis que PyGTK ou PyQt ne sont pas encore disponibles pour Python3. Par contre, le compilateur d'interface XML vers Python PyQt est capable de générer du code Python3.

Installer et tester Python 3.1

Python 3.1 supporte l'ensemble des systèmes d'exploitations modernes. Des paquets binaires Windows et Mac OS X sont téléchargeables, et des paquets pour les distributions Linux/BSD devraient suivre rapidement. En attendant, vous pouvez déjà tester en compilant vous même le code source et en l'installant dans le dossier de votre choix. Exemple :./configure --prefix=/opt/python31 && make && make install La compilation prend cinq minutes. Le code source est distribué sous la Python Software Foundation License (de type BSD).

Python (2.4, 2.5, voire 2.6) est aujourd'hui préinstallé sur la plupart des distributions Linux, NetBSD, OpenBSD et Mac OS X.

Sources

Cette dépêche a été rédigée à partir de l'article Python 3.1, une nouvelle version dans la branche 3.x (site du zéro), du journal de Skorps, du journal de haypo, d'une dépêche refusée de Bruno Michel, ainsi que de la documentation Python 3.1.

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Beau boulot

Posté par chaica () le 02/07/2009 à 10:38. (lien). Évalué à 8.

Dépêche très claire et bien détaillée, un beau boulot. Merci!

Quand switcher ?

Posté par highleaf () le 02/07/2009 à 10:51. (lien). Évalué à 4.

Je continue actuellement mes développements en 2.X. D'après vous, quels seront les éléments déclencheurs qui favoriseront le passage à la branche 3.x. La disponibilité de modules compatibles ? De gros projets qui franchiront le pas ? Quels sont, pour vous, les critères qui vont faire que vous allez switcher ? Votre avis m'intéresse.

PyQt4 et Python v3

Posté par ptifeth (page perso, ) le 02/07/2009 à 10:54. (lien). Évalué à 2.

Je n'ai pas testé la chose, donc je m'exprime sans vraiment savoir, mais des indices concordants instillent le doute quand à l'égal dupport de Python v3 pat PyGtk et PyQT4.

Comme par exemple http://www.riverbankcomputing.co.uk/software/pyqt/download qui permet de télécharger des binaires windows pour Python 3.

L'annonce de support a été faite par Phil Thompson le 4 avril :
http://www.mail-archive.com/pyqt%40riverbankcomputing.com/ms(...)
(dans le même fil, un chemin de migration a été proposé par Giovanni Bajo : http://www.mail-archive.com/pyqt%40riverbankcomputing.com/ms(...) )

Mes 2¢

Simplification de format {}

Posté par chaica () le 02/07/2009 à 11:09. (lien). Évalué à 2.

C'est un petit détail, mais qui simplifie tellement la vie :)

python2

Posté par bilboa () le 02/07/2009 à 12:27. (lien). Évalué à 3.

python2 marche tres bien et continuera d'être utilisé pendant des dizaines d'années
python3 est vraiment sympa quand tu traite des octects par contre. (en tout cas c'est mon utilisation principale)
le seul truc chiant finalement, c'est de trjs taper "print blah" au lieu de "print (blah)" par habitude... ;)

Dictionnaire ordonne

Posté par zeb () le 02/07/2009 à 15:32. (lien). Évalué à 3.

Mis-a-part pour optimiser la recherche des tuples, a quoi sert un dictionnaire ordonne ?

Bit_length

Posté par ǝsɐʃdoıx∀ ıɥs∀ (page perso, ) le 02/07/2009 à 15:49. (lien). Évalué à 2.

> Le type int gagne la méthode bit_length() qui calcule le nombre de bits nécessaires pour représenter le nombre en binaire.

Ha. Y'avait pas la fonction log en base 2 ?
Car s'il y a bien une fonction inutile (et que j'ai bien compris à quoi sert bit_length), c'est bien bit_lenght !

--
Je ne suis pas toujours de mon avis.

Revenir en haut de page