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

« La diffĂ©rence technique fondamentale est que l’opĂ©rateur de choix est ordonnĂ©. Â»
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.

Pour approfondir sur Open Source