Python 3.10

Python 3.10.0 (finale) est sortie le 4 octobre 2021. Les fonctionnalités de la version 3.10 sont définies dans PEP 619 et une description détaillée des changements se trouve dans Nouveautés de Python 3.10.

Nouvelles fonctionnalités de syntaxe

Statut

PEP 634

Filtrage par motif structurel : spécification

[1]

PEP 635

Filtrage par motif structurel : motivation et justification

[1]

PEP 636

Filtrage par motif structurel : tutoriel

[1]

bpo-12782

Les gestionnaires de contexte entre parenthèses sont désormais officiellement autorisés

Nouvelles fonctionnalités de la bibliothèque standard

PEP 618

Ajout d’une vérification optionnelle de la longueur à zip

Améliorations de l’interpréteur

PEP 626

Numéros de ligne précis pour le débogage et d’autres outils

Nouvelles fonctionnalités de typage

PEP 604

Permettre d’écrire les types union sous la forme X | Y

PEP 613

Alias de types explicites

PEP 612

Variables de spécification de paramètres

Dépréciations, suppressions ou restrictions importantes

PEP 644

Exiger OpenSSL 1.1.1 ou plus récent

PEP 632

Déprécation du module distutils.

Non pertinent

PEP 623

Déprécier et préparer la suppression du membre wstr dans PyUnicodeObject.

Non pertinent

PEP 624

Suppression des API d’encodage Py_UNICODE

Non pertinent

PEP 597

Ajout d’un EncodingWarning optionnel

Autres changements du langage :

Le type int possède une nouvelle méthode int.bit_count(), qui renvoie le nombre de uns dans le développement binaire d’un entier donné, également appelé nombre de bits à un (population count).

Les vues renvoyées par dict.keys(), dict.values() et dict.items() possèdent désormais toutes un attribut mapping qui fournit un objet types.MappingProxyType enveloppant le dictionnaire d’origine.

PEP 618 : la fonction zip() possède désormais un indicateur optionnel strict, utilisé pour exiger que tous les itérables aient une longueur égale.

Les fonctions natives et d’extension qui prennent des arguments entiers n’acceptent plus les Decimal, les Fraction ni les autres objets qui ne peuvent être convertis en entiers qu’avec une perte (par exemple ceux qui ont la méthode __int__() mais pas la méthode __index__()).

Si object.__ipow__() renvoie NotImplemented, l’opérateur se rabattra correctement sur object.__pow__() et object.__rpow__() comme prévu.

Les expressions d’affectation peuvent désormais être utilisées sans parenthèses au sein des littéraux d’ensembles et des compréhensions d’ensembles, ainsi que dans les index de séquences (mais pas dans les tranches).

Les fonctions possèdent un nouvel attribut __builtins__ qui est utilisé pour rechercher les symboles natifs lorsqu’une fonction est exécutée, au lieu de consulter __globals__['__builtins__']. L’attribut est initialisé à partir de __globals__["__builtins__"] s’il existe, sinon à partir des fonctions natives courantes.

Deux nouvelles fonctions natives – aiter() et anext() – ont été ajoutées pour fournir des équivalents asynchrones respectivement à iter() et next().

Les méthodes statiques (@staticmethod) et les méthodes de classe (@classmethod) héritent désormais des attributs de méthode (__module__, __name__, __qualname__, __doc__, __annotations__) et possèdent un nouvel attribut __wrapped__. De plus, les méthodes statiques sont désormais appelables comme des fonctions ordinaires.

Les annotations pour des cibles complexes (tout sauf les cibles de type simple name définies par PEP 526) ne produisent plus aucun effet à l’exécution avec from __future__ import annotations.

Les objets classe et module créent désormais paresseusement des dictionnaires d’annotations vides à la demande. Les dictionnaires d’annotations sont stockés dans le __dict__ de l’objet pour des raisons de compatibilité ascendante. Cela améliore les bonnes pratiques de travail avec __annotations__.

Les annotations contenant yield, yield from, await ou des expressions nommées sont désormais interdites sous from __future__ import annotations en raison de leurs effets de bord.

L’utilisation de variables non liées, de super() et d’autres expressions susceptibles de modifier le traitement de la table des symboles dans les annotations est désormais rendue sans effet sous from __future__ import annotations.

Les hachages des valeurs NaN, à la fois du type float et du type decimal.Decimal, dépendent désormais de l’identité de l’objet. Auparavant, elles avaient toujours pour hachage 0 même si les valeurs NaN ne sont pas égales entre elles. Cela entraînait un comportement potentiellement quadratique à l’exécution en raison de collisions de hachage excessives lors de la création de dictionnaires et d’ensembles contenant plusieurs NaN.

Une SyntaxError (au lieu d’une NameError) sera levée lors de la suppression de la constante __debug__.

Les exceptions SyntaxError possèdent désormais des attributs end_lineno et end_offset. Ils valent None s’ils ne sont pas déterminés.

Changements des modules natifs :

asyncio

Ajout de la méthode manquante connect_accepted_socket().

array

La méthode index() de array.array possède désormais des paramètres optionnels start et stop.

gc

Ajout de points d’audit pour gc.get_objects(), gc.get_referrers() et gc.get_referents().

hashlib

Le module hashlib nécessite OpenSSL 1.1.1 ou plus récent.

Le module hashlib offre une prise en charge préliminaire d’OpenSSL 3.0.0.

Le repli purement Python de pbkdf2_hmac() est déprécié. À l’avenir, PBKDF2-HMAC ne sera disponible que lorsque Python aura été compilé avec la prise en charge d’OpenSSL.

os

Ajout de la prise en charge de os.cpu_count() pour le RTOS VxWorks.

Ajout d’une nouvelle fonction os.eventfd() et d’outils associés pour envelopper l’appel système eventfd2 sous Linux.

Ajout de os.splice() qui permet de déplacer des données entre deux descripteurs de fichiers sans copie entre l’espace d’adressage du noyau et celui de l’utilisateur, où l’un des descripteurs de fichiers doit faire référence à un tube.

Ajout de O_EVTONLY, O_FSYNC, O_SYMLINK et O_NOFOLLOW_ANY pour macOS.

platform

Ajout de platform.freedesktop_os_release() pour récupérer l’identification du système d’exploitation à partir du fichier standard freedesktop.org os-release.

socket

L’exception socket.timeout est désormais un alias de TimeoutError.

Ajout d’une option pour créer des sockets MPTCP avec IPPROTO_MPTCP.

Ajout de l’option IP_RECVTOS pour recevoir les champs type de service (ToS) ou DSCP/ECN.

ssl

Le module ssl nécessite OpenSSL 1.1.1 ou plus récent.

Le module ssl offre une prise en charge préliminaire d’OpenSSL 3.0.0 et une nouvelle option OP_IGNORE_UNEXPECTED_EOF.

Les fonctions dépréciées et l’utilisation de constantes dépréciées entraînent désormais une DeprecationWarning. ssl.SSLContext.options a OP_NO_SSLv2 et OP_NO_SSLv3 définis par défaut et ne peut donc pas avertir lorsqu’on définit à nouveau l’indicateur.

Le module ssl possède désormais des paramètres par défaut plus sécurisés. Les chiffrements sans confidentialité persistante ou avec MAC SHA-1 sont désactivés par défaut. Le niveau de sécurité 2 interdit les clés RSA, DH et ECC faibles offrant moins de 112 bits de sécurité. SSLContext utilise par défaut la version minimale de protocole TLS 1.2. Ces réglages sont fondés sur les recherches de Hynek Schlawack.

Les protocoles dépréciés SSL 3.0, TLS 1.0 et TLS 1.1 ne sont plus officiellement pris en charge. Python ne les bloque pas activement. Cependant, les options de compilation d’OpenSSL, les configurations des distributions, les correctifs des fournisseurs et les suites de chiffrement peuvent empêcher la réussite d’une poignée de main.

Ajout d’un paramètre timeout à la fonction ssl.get_server_certificate().

Le module ssl utilise des types alloués sur le tas et une initialisation multiphase.

Un nouvel indicateur de vérification VERIFY_X509_PARTIAL_CHAIN a été ajouté.

sys

Ajout de l’attribut sys.orig_argv : la liste des arguments de ligne de commande d’origine passés à l’exécutable Python.

Ajout de sys.stdlib_module_names, contenant la liste des noms de modules de la bibliothèque standard.

_thread

_thread.interrupt_main() prend désormais un numéro de signal optionnel à simuler (la valeur par défaut reste signal.SIGINT).

Notes