freshidea - stock.adobe.com
Python : les mainteneurs du projet font le ménage avant la 3.10
Alors que Python 3.10 est déjà en développement les responsables du projet ont présenté les nouveautés de la version 3.9 du langage de programmation. Elle signe le véritable arrêt du maintien de Python 2.7, une distribution du langage encore très utilisée.
Impossible de contester la popularité du langage de programmation open source Python. Il caracole dans le trio de tête de la plupart des sondages adressés aux développeurs, il serait même en passe de détrôner Java, selon l’index TIOBE. La version 3.9 fournit aux développeurs plusieurs nouveautés.
La première concerne l’ajout d’un parseur pour CPython basé sur la grammaire PEG (Parsing expression grammar). Celui-ci cohabite pour l’instant avec un parseur LL(1), sans contexte grammatical (Context Free Grammar ou CFG) qui sera supprimé dans la version 3.10. Selon les responsables du projet, une grammaire PEG permet de mieux retranscrire la manière dont l’analyse syntaxique est appliquée à l’exécution.
Simplifier le parseur pour répondre au cycle de développement annuel
Guido Van RossumCréateur de Python
« La différence technique fondamentale est que l’opérateur de choix est ordonné. Cela signifie que, lors de l’écriture d’une règle de type : A | B | C, un parseur CFG (comme le parseur LL(1)) générera des constructions qui, à partir d’une chaîne d’entrée, déduiront quelle alternative (A, B ou C) doit être développée ; tandis qu’un parseur PEG vérifiera si la première alternative réussit et, seulement si elle échoue, il continuera avec la deuxième ou la troisième dans l’ordre où elles sont écrites. L’opérateur de choix n’est donc pas commutatif », écrivent Guido van Rossum, le créateur de Python, ainsi que Pablo Galindo et Lysandros Nikolaou, deux « core developers » sur le projet.
Les performances du nouveau parseur sont équivalentes à celles de l’ancien, mais il offre une plus grande flexibilité, un paramètre important pour l’avenir de Python, selon les contributeurs principaux au langage.
Cette fonctionnalité est transparente pour les utilisateurs, mais permettra le respect de l’engagement retranscrit dans la proposition PEP 602 (Python Enhancement Proposal). Cette dernière stipule que les versions de Python seront disponibles de manière plus régulière.
La PEP 602 fixe la sortie de chaque version majeure au début du mois d’octobre de chaque année. Cette disposition est suivie depuis le début du développement de la version 3.9 et la 3.10 sera disponible au mois d’octobre 2021. La PEP 387, elle, stipule qu’il faut au minimum deux releases avant de déprécier une fonction ou d’effectuer des changements majeurs. De la sorte, les contributeurs adoptent un cycle de développement moins contraignant et plus propice aux mises à jour.
Par ailleurs, plusieurs types natifs de Python (range, tuple, set, frozenset, list et dict) sont maintenant accélérés par le protocole vectorcall pour CPython. Celui-ci est dépendant de l’API C. La convention d’appel précédente, tp_call, demandait de créer des tuples et éventuellement des dictionnaires intermédiaires. De même, tp_call dispose d’un pointeur par fonction et non par objet. Là encore cela demande d’appeler plusieurs objets intermédiaires, selon les contributeurs. Avec vectorcall, les pointeurs ciblent les objets. Un appel crée un tuple nommé kwnames et accélère de la sorte les exécutions.
Des ajouts qui améliorent (encore) la lisibilité du langage
Python 3.9 bénéficie également de deux opérateurs pour la fusion et les mises à jour des dictionnaires. Auparavant, trois méthodes existaient pour fusionner les dictionnaires. Seulement, deux de ces techniques étaient soit peu explicites, soit impliquaient de copier ces objets pour éviter l’écrasement définitif de tout ou partie des clés qu’ils contiennent. Les opérateurs merge (|) et update (|=) dans la classe dict simplifie cette étape en écrasant les clés à fusionner et en ajoutant celles souhaitées par le développeur.
Deux modifications liées aux dictionnaires, mais aussi aux listes sont maintenant disponibles. Python 3.9 bénéficie de deux nouveaux types génériques natifs (type hinting en VO). Les mots-clés dict et list permettent de spécifier le type de certains objets dans le code au lieu d’utiliser d’importer les bibliothèques des types List et Dict avec des majuscules.
Un autre ajout rend le langage plus accessible aux débutants : deux méthodes pour supprimer les préfixes et les suffixes dans les chaînes de caractères. Les objets str.removeprefix(prefix) et str.removesuffix(suffix) s’ajoutent aux méthodes dites « slices » [len(prefix) :] et [ :-len(suffix)], moins compréhensibles pour un profane. Certains développeurs se devaient de commenter les slices pour expliciter leur utilité. Ici la fonction des objets est lisible à même le code.
La PEP 593 apporte des annotations flexibles pour les fonctions et les variables, tandis que la base de données de fuseau horaire IANA fait maintenant partie de la librairie standard via le module zoneinfo. Graphlib, lui, est un module pour effectuer un tri topologique des graphiques.
Python 3.9 a aussi le droit à son lot d’optimisations, à commencer par la gestion des signaux dans les applications multithreadées. Auparavant, la boucle d’évaluation était interrompue à chaque instruction de bytecode pour vérifier les signaux qui ne peuvent pas être traités. Dorénavant, « si un thread différent du thread principal reçoit un signal, cette boucle se poursuit. Seul le thread principal peut traiter le signal », peut-on lire dans la documentation. Une trentaine de modules (comme importlib, poplib, fpblib, asyncio, etc.) ont également été améliorés.
Python 3.9 sonne le véritable glas pour le support de Python 2.7
Mais il ne faut pas oublier de mentionner les dépréciations et les suppressions. Le sujet le plus important concerne la suppression de plusieurs fonctionnalités qui maintenaient une rétrocompatibilité à Python 2.7, la dernière version de Python 2.x qui n’est désormais plus supportée (la mise à jour finale 2.7.18 date d’avril 2020). Plusieurs objets et classes ne sont plus utilisés, d’autres sont dépréciés, certains seront supprimés.
« Python 3.9 est la dernière version qui fournit ces couches de rétrocompatibilité Python 2, afin de donner plus de temps aux responsables des projets Python pour organiser la suppression du support de Python 2 et ajouter le support de Python 3.9 », prévient la documentation.
Plusieurs fonctionnalités et composants de l’API C, dépréciés depuis les précédentes versions de Python (3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.7 et 3.8), sont maintenant supprimés.
Certaines entreprises ont pris le pas. Dataiku, l’éditeur d’une plateforme de data science, par exemple, prend en charge Python 3.6 et les versions supérieures. Databricks, un autre acteur de ce secteur, a également arrêté le support de Python 2 depuis sa version 5.5. Pour autant, cela ne veut pas dire que Python 2.x est mort. Certains éditeurs et fournisseurs d’autres domaines maintiennent le support. Par exemple, Red Hat prendra en charge Python 2.7 jusqu’en juin 2024 dans sa distribution RHEL 8 pour les serveurs d’entreprise.