URL: https://linuxfr.org/users/serge_ss_paille/journaux/exit-pyth-on-ran-2 Title: Exit Pyth(on|ran)2 Authors: serge_sans_paille Date: 2020年01月10日T09:41:16+01:00 License: CC By-SA Tags: python3, pythran et python Score: 41 Demat'iNal, parmi les vœux de 2020, il y en a un qui ne devrait pas passer inaperçu tellement il est attendu depuis longtemps. Je veux bien évidement parler de l'abandon officiel du support de Python2 au profit de Python3. Les plus abasourdis pourront lire le [python 3 statement](https://python3statement.org/). Et tout particulièrement cette phrase :> We will then be able to simplify our code and take advantage of the many new> features in the current version of the Python language and standard library. On nous promet une grande simplification... qu'en est-il ? Je vous propose une petite étude de cas à travers un exemple qui, à défaut d'être représentatif, est cher à mon cœur. Je veux bien évidement parler du compilateur [pythran](https://pythran.readthedocs.io/en/latest/). La version [0.9.5](https://pypi.org/project/pythran/0.9.5/), sortie il y a peu, était la dernière à être compatible avec Python 2.7 et Python 3. Depuis j'ai commis (du verbe commettre, et pas *commiter* hein) [97ea22f7](https://github.com/serge-sans-paille/pythran/commit/97ea22f7126742f824a4bf7b347c820829b9fa12), sobrement intitulé> Remove all reference to py2 code and behavior from pythran Cette phrase anodine cache pas mal de choses, notamment> 678 changed files with 2,376 additions and 3,555 deletions Et> code and *behavior* Car oui, Pythran devait, dans une représentation commune, modéliser le code python2 et python3, d'où pas mal de changement et simplifications à la clef. Les simplifications mises en œuvre ont donc été : 1. Suppression de tout le code du style ``if sys.version_info.major == 2:``, et de son équivalent C++ ``#if defined(PY_MAJOR_VERSION) && PY_MAJOR_VERSION < 3``. Exit les ``from __future__ import`` itou. 2. Renommage de ``__builtin__`` en ``builtins``. 3. Suppression de fonctions et types non-supportées en Python3 comme ``cmp``, ``xreadlines``, ``StandardError``, ``itertools.i(map|zip|filter)`` etc. Déplacement de certaines fonctions, notamment ``__builtins__.reduce`` dans ``functools.reduce``. 4. Modification de la sémantique de certaines fonctions : ``dict.(items|values|keys)``, ``range``, ``zip`` etc. Heureusement, la version C++ de ces fonctions existaient déjà pour implémenter ``dict.iter(items|values|keys)``, ``xrange``, ``itertools.izip``, respectivement. 5. Modification de certaines optimisations, comme la transformation de listes en générateur, vu que la sémantique de certaines fonctions a changé (cf. point **4.**) 6. Diminution notable du temps de validation, vu qu'on valide maintenant uniquement sur python 3 :-) Alors, certes, l'impact sur les utilisateurs n'est pas négligeable, certains d'entre eux étaient peut-être encore scotché à Python2, et enlever le scotch, bah ça fait mal à la pilosité. Mais comme numpy me [précède de un an](https://docs.scipy.org/doc/numpy-1.14.0/neps/dropping-python2.7-proposal.html), et ne fournit [plus de mise à jour pour Python 2](https://pypi.org/project/numpy/1.18.1/#files) ce n'est pas bien grave !