Python 3.9: Quoi de neuf et de meilleur

Python 3.9, publié aujourd'hui, apporte des changements significatifs à la fois aux fonctionnalités du langage et à la façon dont le langage est développé. Python a gagné en popularité ces dernières années et son utilisation a explosé dans des domaines en évolution rapide tels que la science des données et l'apprentissage automatique. Le projet travaille d'arrache-pied pour suivre le rythme de toutes les nouvelles demandes. 

Voici un aperçu de toutes les grandes nouvelles fonctionnalités de Python 3.9.

Python passe à un cycle de publication annuel

Jusqu'à présent, Python a été développé et publié sur une cadence de dix-huit mois. Le PEP 602 a proposé que l'équipe de développement Python adopte un cycle de publication annuel, et cette proposition a été acceptée. 

Un cycle de publication annuel signifie moins de fonctionnalités par version, mais cela signifie également un retour plus rapide sur les tests de fonctionnalités, moins de modifications potentiellement cassantes pour chaque version, et donc plus d'incitation pour les utilisateurs et les gestionnaires de distribution Linux à mettre à niveau Python plus souvent. Cela signifie également que les nouvelles fonctionnalités proposées à la fin du cycle de développement ne prendront pas autant de temps pour être intégrées dans une nouvelle version.

Le nouveau calendrier signifie que Python 3.9 sera disponible en octobre 2020. Python 3.10 a officiellement commencé le développement pré-alpha le 19 mai 2020, entrera dans la phase de développement alpha lorsque Python 3.9 sera disponible et sera disponible en octobre 2021. Les futures versions de Python suivront le même modèle.

Python devient plus rapide par défaut

Chaque révision de Python bénéficie d'améliorations de performances par rapport à la version précédente. Python 3.9 intègre deux grandes améliorations qui améliorent les performances sans nécessiter de modification du code existant.

La première amélioration implique une plus grande utilisation du vectorcallprotocole introduit dans Python 3.8. vectorcallaccélère de nombreux appels de fonction courants en minimisant ou en éliminant les objets temporaires créés pour l'appel. Dans Python 3.9, plusieurs modules intégrés Python - range, tuple, set, frozenset, list, dict- utilisent en vectorcallinterne pour accélérer l'exécution.

Le deuxième grand améliorateur de performances est une analyse plus efficace du code source Python. Le nouvel analyseur pour le runtime CPython n'a pas été conçu pour résoudre les problèmes de performances, mais plutôt pour traiter les incohérences internes dans l'analyseur d'origine. Cependant, un avantage marginal important est une analyse plus rapide, en particulier pour les gros volumes de code.

Plus de fonctions de chaîne et de dictionnaire Python

Python facilite la manipulation des types de données courants, et Python 3.9 étend cette facilité avec de nouvelles fonctionnalités pour les chaînes et les dictionnaires. Pour les chaînes, il existe de nouvelles méthodes pour supprimer les préfixes et les suffixes, opérations qui ont longtemps nécessité beaucoup de travail manuel. Pour les dictionnaires, il existe désormais des opérateurs d'union, l'un pour fusionner deux dictionnaires dans un nouveau dictionnaire et l'autre pour mettre à jour le contenu d'un dictionnaire avec un autre dictionnaire.

Les décorateurs perdent certaines restrictions

Les décorateurs vous permettent d'encapsuler des fonctions Python pour modifier leurs comportements par programmation. Auparavant, les décorateurs ne pouvaient être constitués que du symbole @, d'un nom (par exemple func) ou d'un nom en pointillé ( func.method) et éventuellement d'un seul appel ( func.method(arg1, arg2)). Avec Python 3.9, les décorateurs peuvent désormais être constitués de n'importe quelle expression valide.

Un moyen de longue date de contourner cette restriction était de créer une fonction ou une expression lambda qui remplacerait une expression plus complexe lorsqu'elle était utilisée comme décorateur. Maintenant, n'importe quelle expression fera l'affaire, à condition qu'elle produise quelque chose qui puisse fonctionner comme un décorateur.

Nouvelles opérations de type Python

Au cours des dernières versions, Python a étendu la prise en charge de l'indication de type. C'est principalement pour les linters et les vérificateurs de code; les types ne sont pas appliqués au moment de l'exécution dans CPython, et il n'est pas prévu de faire de Python un langage typé statiquement. Mais l'indication de type est un outil puissant pour assurer la cohérence dans les grandes bases de code, de sorte que le code Python peut toujours bénéficier d'indices de type. 

Deux nouvelles fonctionnalités pour l'indication de type et les annotations de type ont fait leur chemin dans Python 3.9. Dans l'un, les indices de type pour le contenu des collections - par exemple, les listes et les dictionnaires - sont désormais disponibles en Python de manière native. Cela signifie que vous pouvez par exemple décrire une liste comme list[int] - une liste d'entiers - sans avoir besoin de la typingbibliothèque pour le faire.

Le deuxième ajout aux mécanismes de typage de Python est une fonction flexible et des annotations variables. Cela permet d'utiliser le Annotatedtype pour décrire un type à l'aide de métadonnées qui peuvent être examinées à l'avance (avec des outils de linting) ou à l'exécution. Par exemple, Annotated[int, ctype("char")]pourrait être utilisé pour décrire un entier qui devrait être considéré comme un chartype en C. Par défaut, Python ne ferait rien avec une telle annotation, mais il pourrait être utilisé par les linters de code. 

Améliorations apportées aux composants internes de Python

Nettoyer, affiner et moderniser les composants internes de Python est une initiative en cours pour les développeurs de Python, et Python 3.9 a quelques changements dans cette veine.

Le premier est une refonte de la façon dont les modules interagissent avec les machines d'importation. Les modules d'extension Python, écrits en C, peuvent désormais utiliser un nouveau mécanisme de chargement qui les fait se comporter davantage comme des modules Python normaux lorsqu'ils sont importés. Plusieurs modules dans la bibliothèque standard de Python prennent en charge ce comportement nouveau: _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref. Le nouveau mécanisme de chargement permet non seulement aux modules d'extension d'être gérés de manière plus flexible par Python, mais permet également de nouvelles fonctionnalités telles que des comportements d'accrochage avancés.

La deuxième initiative de nettoyage est une ABI interne stable pour CPython, garantie pour la durée de vie de Python 3. Historiquement, chaque révision majeure de Python a été incompatible avec ABI avec les versions précédentes, nécessitant la recompilation des modules d'extension pour chaque nouvelle version. À partir de maintenant, tous les modules d'extension qui utilisent l'ABI stable fonctionneront avec les versions de Python. Avec Python 3.9, les modules suivants dans la bibliothèque standard utilisent l'écurie ABI: audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib.

Autres changements dans Python 3.9

  • La bibliothèque standard de Python prend désormais en charge la base de données de fuseaux horaires IANA. Cette base de données est bien entretenue et largement utilisée, et avoir un moyen direct de l'utiliser dans la bibliothèque datetime de Python vous fera gagner beaucoup de temps.
  • Les nouvelles méthodes de chaîne permettent de supprimer facilement les préfixes et les suffixes. C'est l'un de ces scénarios d'utilisation courants et quotidiens qui nécessitaient un peu trop de passe-partout qu'il ne semblait nécessaire. Les méthodes new .removeprefix()et .removesuffix()renvoient une copie modifiée d'une chaîne moins le préfixe ou le suffixe en question, à condition qu'ils existent dans la chaîne.

Comment faire plus avec Python

  • 4 vérificateurs de type Python pour garder votre code propre
  • Style Python: 5 outils pour nettoyer votre code Python
  • Comment travailler avec le type de données Liste Python
  • Comment empaqueter des applications Python avec BeeWare Briefcase
  • Comment faire fonctionner Anaconda côte à côte avec d'autres pythons
  • Comment utiliser les classes de données Python
  • Démarrez avec async en Python
  • Comment utiliser asyncio en Python
  • 3 étapes pour une refonte asynchrone Python
  • Comment utiliser PyInstaller pour créer des exécutables Python
  • Tutoriel Cython: Comment accélérer Python
  • Comment installer Python de manière intelligente
  • Comment gérer des projets Python avec Poetry
  • Comment gérer des projets Python avec Pipenv
  • Virtualenv et venv: les environnements virtuels Python expliqués
  • Python Virtualenv et Venv à faire et à ne pas faire
  • Explication des threads et sous-processus Python
  • Comment utiliser le débogueur Python
  • Comment utiliser timeit pour profiler le code Python
  • Comment utiliser cProfile pour profiler le code Python
  • Comment convertir Python en JavaScript (et inversement)