web-dev-qa-db-fra.com

Pourquoi les gens hésitent-ils à utiliser Python 3?

Python 3 est sorti en décembre 2008. Beaucoup de temps s'est écoulé depuis, mais aujourd'hui encore, de nombreux développeurs hésitent à utiliser Python 3. Même les frameworks populaires comme Django ne sont pas encore compatibles avec Python 3 mais dépendent toujours de Python 2.

Bien sûr, Python 3 a quelques incompatibilités avec Python 2 et certaines personnes doivent se fier à la compatibilité descendante. Mais n'a pas Python 3 existe depuis assez longtemps maintenant pour que la plupart des projets changent ou commencent par Python 3?

Avoir deux versions concurrentes présente de nombreux inconvénients; deux branches doivent être maintenues, confusion pour les apprenants, etc. Alors, pourquoi y a-t-il tant d'hésitation dans la communauté Python à propos du passage à Python 3?

225
Ham Vocke

Notez que je ne mets plus à jour cette réponse. J'ai beaucoup plus de Python 3 Q & A sur mon site personnel à http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html

Réponse précédente:

(Mise à jour de l'état, septembre 2012)

Nous (c.-à-d. Les développeurs principaux Python) prévoyions, lors de la sortie de Python 3.0, qu'il faudrait environ 5 ans pour que 3.x devienne le choix "par défaut" pour les nouveaux projets au cours des 2 Série .x. Cette prédiction explique pourquoi la période de maintenance prévue pour la version 2.7 est si longue.

La version d'origine Python 3.0 s'est également avérée présenter des problèmes critiques avec de mauvaises performances IO qui la rendaient effectivement inutilisable pour la plupart des applications pratiques, il est donc plus logique de démarrer la chronologie à partir de la version de Python 3.1 fin juin 2009. (Ces IO problèmes de performances sont également la raison pour laquelle il n'y a pas de versions de maintenance 3.0.z: il n'y a aucune bonne raison pour que quelqu'un veuille s'en tenir avec 3.0 sur mise à niveau vers 3.1).

Au moment de la rédaction (septembre 2012), cela signifie que nous sommes actuellement un peu plus de 3 ans dans le processus de transition, et cette prédiction semble toujours sur la bonne voie.

Alors que les gens tapant Python 3 le code est le plus régulièrement mordu par des changements syntaxiques comme print devenant une fonction, cela fait n'est pas un problème pour le portage de bibliothèque car l'outil de conversion automatisé 2to3 le gère très bien.

Le plus gros problème dans la pratique est en fait un problème sémantique: Python 3 ne vous permet pas de jouer rapidement et librement avec les encodages de texte comme le fait Python 2. C'est à la fois son plus grand avantage sur Python 2, mais aussi le plus grand obstacle au portage: vous devez corriger vos problèmes de gestion Unicode pour faire fonctionner un port correctement (alors qu'en 2.x, une grande partie de ce code produisait silencieusement des données incorrectes avec des entrées non ASCII, donnant l'impression de fonctionner, en particulier dans les environnements où les données non ASCII sont rares).

Même la bibliothèque standard dans Python 3.0 et 3.1 avait toujours des problèmes de gestion Unicode, ce qui rend difficile le portage de nombreuses bibliothèques (en particulier celles liées aux services Web).

3.2 a résolu un grand nombre de ces problèmes, fournissant une bien meilleure cible pour les bibliothèques et les frameworks comme Django. 3.2 a également apporté la première version de travail de wsgiref (la principale norme utilisée pour la communication entre les serveurs Web et les applications Web écrites en Python) pour 3.x, qui était une condition préalable nécessaire à l'adoption dans l'espace Web.

Les dépendances clés comme NumPy et SciPy ont maintenant été portées, les outils d'installation et de gestion des dépendances comme zc.buildout, pip et virtualenv sont disponibles pour 3.x, la version Pyramid 1.3 prend en charge Python 3.2, la prochaine version Django 1.5 inclut la prise en charge expérimentale Python 3, et la version 12.0 de la structure de réseau Twisted a supprimé la prise en charge de Python 2.5 afin d'ouvrir la voie à la création d'une version compatible Python 3.

En plus des progrès sur les bibliothèques et les frameworks de compatibilité Python 3, l'implémentation populaire de l'interpréteur PyPy compilé par JIT travaille activement sur la prise en charge de Python 3.

Les outils de gestion du processus de migration se sont également nettement améliorés. En plus de l'outil 2to3 fourni dans le cadre de CPython (qui est maintenant considéré comme le mieux adapté pour les conversions ponctuelles d'applications qui n'ont pas besoin de maintenir la prise en charge du 2.x série), il y a aussi python-modernize , qui utilise l'infrastructure 2to3 pour cibler le (grand) sous-ensemble commun de Python 2 et Python 3. Cet outil crée une base de code unique qui s'exécutera sur les deux Python 2.6+ et Python 3.2+ à l'aide de six bibliothèque de compatibilité. La version Python 3.3 élimine également une cause majeure de "bruit" lors de la migration des applications existantes Unicode: Python 3.3 prend à nouveau en charge le préfixe "u" pour les littéraux de chaîne (il ne en fait faites n'importe quoi dans Python 3 - il a juste été restauré pour éviter de faire par inadvertance une migration vers Python 3 plus difficile pour les utilisateurs qui avaient déjà correctement distingué leur texte et leurs littéraux binaires dans Python 2).

Nous sommes donc en fait assez satisfaits de la façon dont les choses progressent - il nous reste encore près de 2 ans pour notre calendrier d'origine, et les changements se répercutent bien sur l'ensemble de l'écosystème Python.

Étant donné que de nombreux projets ne conservent pas correctement leurs métadonnées Python Package Index et que certains projets avec des responsables moins actifs ont été bifurqués pour ajouter la prise en charge de Python 3, les scanners PyPI purement automatisés offrent toujours une vue trop négative de l'état de la prise en charge de la bibliothèque Python 3.

Une alternative préférée pour obtenir des informations sur le niveau de prise en charge de Python 3 sur PyPI est http://py3ksupport.appspot.com/

Cette liste est personnellement organisée par Brett Cannon (un développeur de longue date Python noyau) pour tenir compte des métadonnées de projet incorrectes, Python 3 prise en charge qui est dans les outils de contrôle de code source mais pas encore dans un version officielle, et les projets qui ont des fourches plus à jour ou des alternatives qui prennent en charge Python 3. Dans de nombreux cas, les bibliothèques qui ne sont pas encore disponibles sur Python 3 manquent des dépendances clés et/ou le manque de prise en charge de Python 3 dans d'autres projets diminue la demande des utilisateurs (par exemple, une fois que le framework de base Django est disponible sur Python 3, des outils connexes comme South et Django-céleri est plus susceptible d'ajouter la prise en charge de Python 3 et la disponibilité de la prise en charge de Python 3 dans Pyramid et Django rend plus probable que le support Python 3 sera implémenté dans d'autres outils comme gevent).

Le site à http://getpython3.com/ comprend d'excellents liens vers des livres et d'autres ressources pour Python 3, identifie certaines bibliothèques et frameworks clés qui prennent déjà en charge Python 3, et fournit également des informations sur la façon dont les développeurs peuvent demander une assistance financière à la PSF pour porter des projets clés vers Python 3.

Une autre bonne ressource est la page wiki de la communauté sur les facteurs à considérer lors du choix d'une version Python pour un nouveau projet: http://wiki.python.org/moin/Python2orPython

250
ncoghlan

Je pense qu'une grande partie de l'hésitation vient de deux choses:

  • Si ce n'est pas cassé, ne le répare pas
  • [Bibliothèque XYZ] dont nous avons besoin n'a pas de port 3.0

Il y a pas mal de différences dans le comportement du langage principal, décrites dans ce document . Quelque chose d'aussi simple que de changer "print" d'une instruction en une fonction, par exemple, cassera un lot de Python = 2.x code - et ce n'est que le plus simple. Ils se sont débarrassés des classes de style plus ancien en 3.0. Ce sont, en fait, des langages très différents - donc le portage de l'ancien code n'est pas aussi simple que certains pourraient le supposer.

48
TZHX

Il n'y a pas de raisons compulsives pour que les entreprises existantes passent du temps, de l'argent et des efforts à migrer vers quelque chose tout en n'ayant aucun changement dans l'ensemble de fonctionnalités existant. Je veux dire que la base de code sur Python 2 est opérationnelle depuis longtemps est stable, testée et dispose de toutes les fonctionnalités actuelles du produit. Pourquoi quelqu'un passerait-il du temps, de l'argent et l'effort juste pour déplacer Python 3 juste pour le plaisir de migrer vers lui.

Outre la post-migration, il n'y a pas d'échecs de régression et tout ce mal de tête est inévitable.

Pour les nouveaux projets, la politique est claire et simple, tout commence sur les points suivants:

  1. Est-ce qu'une distribution comme Ubuntu est livrée Python 3 dans leur installation par défaut?
  2. Quel est l'écosystème de bibliothèque pour Python 3.
  3. Tous les frameworks et autres sont-ils compatibles avec Python 3. etc etc.

C'est votre processus habituel de "choisir une nouvelle langue". C'est là que le problème des œufs de poule entre en jeu. Peu de gens l'utilisent parce que peu de gens l'utilisent. En fin de compte, personne n'a envie d'y aller du tout.

Rompre la compatibilité descendante n'a jamais été une bonne chose, à la fin, vous finissez toujours par un bon pourcentage d'utilisateurs.

28
kamaal

Autour du temps Python 2.0 est sorti, Python gagnait rapidement en popularité. Il y avait beaucoup de nouveaux utilisateurs qui utilisaient naturellement la dernière version, car ils n'avaient pas dépendances des anciennes versions. Avec beaucoup de gens adoptant 2.0 par défaut, il y avait beaucoup de pression sur les développeurs de bibliothèques, etc.

Au moment où Python 3.0 est sorti, il y avait déjà un grand nombre d'utilisateurs dépendant de Python 2.0, et une croissance exponentielle (en gardant un facteur constant par rapport à l'existant) utilisateurs) ne peut évidemment pas être soutenu indéfiniment.

Personnellement, les nouvelles fonctionnalités de Python 2 jours semblaient beaucoup plus convaincantes que celles fournies par Python 3.

Je pensais que Python 3 finirait par prendre le relais de toute façon, mais je n'en suis pas si sûr maintenant. Mais ce n'est pas seulement Python qui a ce problème. Après tous, combien de personnes utilisent honnêtement Perl 6? Cela fait un peu plus longtemps que Python 3, IIRC.

14
Steve314

Un grand obstacle pour moi, que je ne pense pas pouvoir résoudre par la traduction automatique, est la division entière. J'ai des codes scientifiques qui reposent sur x/2 donnant x arrondi (lorsque x est un entier).

Python 3 ne ferait pas cela, mais donnerait une réponse 0,5 (pour les x impairs).
Je ne peux pas simplement remplacer all/dans mon code par // parce que parfois je fais la division float, et je veux donc le comportement float.

Donc, pour moi de porter sur python 3, je vais devoir parcourir des dizaines de milliers de lignes de code, vérifier chaque/et voir si je peux comprendre si cela devrait être/ou //.

11
Sharky

Du point de vue des services Web: aucun des principaux cadres de serveurs ni cadres Web ne prend en charge Python3.

Mise à jour: Évidemment, c'était le cas au début de 2011, à partir de maintenant (fin 2013), la plupart des principaux cadres fonctionnent avec Python3. Cependant, certains ne sont toujours pas compatibles. Un exemple significatif serait Twisted, où c'est toujours un travail en cours .

10
vartec

Python 3 est agréable pour démarrer un nouveau projet si toutes les bibliothèques dont vous avez besoin sont déjà portées sur Py3k.

Si ce n'est pas une option, utiliser Python 2.7 est le meilleur des deux mondes: vous avez la plupart de toutes les bibliothèques créées pour Python 2.x et vous pouvez progressivement modifier votre code pour qu'il soit compatible avec Py3k, afin que la migration soit facile lorsque vous le décidez. La liste des goodies de syntaxe de Py3k que vous avez déjà en 2.7 est assez longue, n'oubliez pas d'importer de __future__. Mes favoris sont Unicode par défaut et la division produit toujours un flottant.

10
9000

Il n'y a aucune raison impérieuse que j'aie vue d'utiliser P3K à moins que vous ne fassiez un gros travail sur i18n. Dans mes incursions, j'ai trouvé l'Unicode omniprésent comme une barrière à mon travail (ASCII) et aux générateurs obligatoires pour obstruer mon code.

Dans quelques années, 3 présentera un environnement plus convaincant, mais pas aujourd'hui.

8
Paul Nathan

Les distributions ne rendent pas Python3 disponible. Il existe des distributions marginales qui passent déjà hors de Python2. Mais les variantes Linux traditionnelles comme Debian, Ubuntu, etc. ne le font pas. C'est la principale raison pour laquelle, en tant qu'auteur de l'application, je ne fais pas non plus.

Bien que j'aie préparé la transition et que j'essaie même d'éviter les constructions syntaxiques qui ont été incompatibilisées, je ne peux pas la tester correctement. Cela se résume vraiment au problème du poulet et des œufs.

4
mario