Les nouveautés de Python 3.9

Éditeur:

Łukasz Langa

This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog.

Voir aussi

PEP 596 – Calendrier de sortie de Python 3.9

Résumé – Points marquants de cette version

Nouvelles fonctionnalités de syntaxe :

  • PEP 584, ajout de l'opérateur d'union à dict ;

  • PEP 585, indications des types paramétrables dans les collections natives ;

  • PEP 614, restrictions grammaticales assouplies pour les décorateurs.

Nouvelles fonctionnalités natives :

  • PEP 616, méthodes sur les chaînes pour enlever des préfixes et des suffixes.

Nouvelles fonctionnalités dans la bibliothèque standard :

  • PEP 593, annotations flexibles pour les fonctions et les variables ;

  • ajout de os.pidfd_open() qui permet la gestion de processus sans concurrence critique et sans signaux.

Améliorations de l'interpréteur :

  • PEP 573, accès rapide à l'état des modules à partir des méthodes des types dans les extensions C ;

  • PEP 617, CPython utilise maintenant un analyseur lexical PEG (Parsing Expression Grammar) ;

  • certains types Python natifs (range, tuple, set, frozenset, list, dict) sont maintenant plus rapides grâce aux appels vectorcall (PEP 590) ;

  • le ramasse-miettes ne bloque pas sur les objets ressuscités ;

  • a number of Python modules (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref) now use multiphase initialization as defined by PEP 489;

  • a number of standard library modules (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) are now using the stable ABI defined by PEP 384.

Nouveaux modules de la bibliothèque :

  • PEP 615, la base de données des fuseaux horaires de l'IANA est maintenant incluse dans le module zoneinfo de la bibliothèque standard ;

  • une implémentation du tri topologique d'un graphe est maintenant disponible dans le nouveau module graphlib.

Changements aux procédures de publication :

  • PEP 602, CPython adopte un cycle annuel de publications.

Vous devez vérifier la présence de DeprecationWarning dans votre code

Quand Python 2.7 était encore pris en charge, plusieurs fonctionnalités dans Python 3 étaient gardées pour la rétro-compatibilité avec Python 2.7. Avec la fin de la prise en charge de Python 2, ces couches de rétro-compatibilité ont été retirées ou le seront bientôt. La plupart d'entre elles émettaient un avertissement DeprecationWarning depuis plusieurs années. Par exemple, utiliser collections.Mapping plutôt que collections.abc.Mapping émettait un DeprecationWarning depuis Python 3.3, publié en 2012.

Testez votre application avec l'option de ligne de commande -W default pour voir les DeprecationWarning et les PendingDeprecationWarning, ou même avec -W error pour les traiter comme des erreurs. Le filtre des avertissements peut être utilisé pour ignorer les avertissements provenant de code de tierces parties.

Python 3.9 est la dernière version qui fournit ces couches de rétro compatibilité avec Python 2, afin de donner plus de temps aux mainteneurs de projets Python pour organiser l'arrêt de la prise en charge de Python 2 et pour assurer celle de Python 3.9.

Les alias vers Abstract Base Classes dans le module collections, comme l'alias collections.Mapping vers collections.abc.Mapping, sont conservés pour une dernière version au titre de la rétrocompatibilité. Ils seront supprimés de Python 3.10.

Plus généralement, essayez d'exécuter vos tests dans le Python Development Mode qui aide à préparer votre code pour le rendre compatible avec la prochaine version de Python.

Note : certaines déclarations d’obsolescence pré-existantes ont été retirées de cette version de Python. Voir la section Retraits.

Nouvelles fonctionnalités

Opérateurs de fusion et de mise à jour de dictionnaires

Ajout des opérateurs de fusion (|) et de mise-à-jour (|=) à la classe native dict. Ils viennent compléter les méthodes existantes dict.update et {**d1, **d2} pour fusionner des dictionnaires.

Exemple :

>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

Voir PEP 584 pour une description complète (contribution de Brandt Bucher dans bpo-36144).

Nouvelles méthodes sur les chaînes pour retirer des préfixes et des suffixes

str.removeprefix(préfixe) et str.removesuffix(suffixe) ont été ajoutées pour supprimer facilement un préfixe ou un suffixe inutile d'une chaîne. Les méthodes correspondantes de bytes, bytearray et collections.UserString ont également été ajoutées. Voir PEP 616 pour une description complète (contribution de Dennis Sweeney dans bpo-39939).

Indication des types paramétrables dans les collections natives

Dans les annotations de type, vous pouvez maintenant utiliser les types de collection natifs tels que list et dict comme types génériques au lieu d'importer les types en majuscules correspondants (par exemple List ou Dict) à partir de typing. D'autres types de la bibliothèque standard sont maintenant génériques, par exemple queue.Queue.

Exemple :

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

Voir PEP 585 pour plus de détails (contribution de Guido van Rossum, Ethan Smith et Batuhan Taşkaya dans bpo-39481).

Nouvel analyseur syntaxique

Python 3.9 utilise un nouvel analyseur syntaxique, basé sur PEG au lieu de LL(1). Les performances du nouvel analyseur sont à peu près comparables à celles de l'ancien, mais le formalisme PEG est plus souple que LL(1) lorsqu'il s'agit de concevoir des nouvelles fonctionnalités du langage. Nous commencerons à utiliser cette flexibilité dans Python 3.10 et les versions suivantes.

Le module ast utilise le nouvel analyseur syntaxique et produit le même AST que l'ancien analyseur.

In Python 3.10, the old parser will be deleted and so will all functionality that depends on it (primarily the parser module, which has long been deprecated). In Python 3.9 only, you can switch back to the LL(1) parser using a command line switch (-X oldparser) or an environment variable (PYTHONOLDPARSER=1).

Voir PEP 617 pour plus de détails (contribution de Guido van Rossum, Pablo Galindo et Lysandros Nikolaou dans bpo-40334).

Autres changements au langage

  • __import__() lève maintenant ImportError plutôt que ValueError, ce qui se produisait lorsqu’un import relatif remontait plus loin que le répertoire racine du paquet (contribution de Ngalim Siregar dans bpo-37444).

  • Python récupère maintenant le chemin absolu du nom de fichier du script spécifié sur la ligne de commande (ex. : python3 script.py) : l'attribut __file__ du module __main__ est devenu un chemin absolu, plutôt qu'un chemin relatif. Ces nouveaux chemins restent valides même après que le répertoire courant est changé par os.chdir(). En conséquence, les traces d'appels affichent le chemin absolu pour les cadres du module __main__ dans ce cas (contribution de Victor Stinner dans bpo-20443).

  • Dans le mode de développement de Python et dans les compilations en mode débogage, les arguments encoding et errors sont maintenant vérifiés pour les opérations d'encodage et de décodage de chaînes. Exemples : open(), str.encode() et bytes.decode().

    Par défaut, afin d'améliorer les performances, l'argument errors n'est consulté qu'au moment de la première erreur d'encodage-décodage et l'argument encoding est parfois ignoré pour les chaînes vides (contribution de Victor Stinner dans bpo-37388).

  • "".replace("", s, n) renvoie maintenant s plutôt qu'une chaîne vide pour toute valeur non-nulles de n. Ce comportement est maintenant cohérent avec "".replace("", s). Les instances de bytes et bytearray ont le même comportement (contribution de Serhiy Storchaka dans bpo-28029).

  • Toute expression valide peut maintenant être utilisée comme décorateur (voir decorator). Préalablement, la grammaire était beaucoup plus contraignante. Voir PEP 614 pour les détails (contributions de Brandt Bucher dans bpo-39702).

  • Aide améliorée pour le module typing. La documentation est maintenant visible pour toutes les formes spéciales et les alias générique spéciaux (comme Union et List). Utiliser help() sur un alias générique comme List[int] montre l'aide correspondant au type réel (list dans ce cas). (Contribution de Serhiy Storchaka dans bpo-40257).

  • L'exécution parallèle de aclose() / asend() / athrow() est maintenant interdite, et ag_running reflète maintenant le statut réel du générateur asynchrone. (Contribué par Yury Selivanov dans bpo-30773.)

  • Les erreurs inattendues lors d'un appel de la méthode __iter__ ne sont plus masquées par TypeError dans l'opérateur in et les fonctions contains(), indexOf() et countOf() du module operator. (Contribué par Serhiy Storchaka dans bpo-40824.)

  • Les expressions lambda sans parenthèses ne peuvent plus être la partie expression dans une clause if dans les compréhensions de liste et les expressions de générateur. Voir bpo-41848 et bpo-43755 pour plus de détails.

Nouveaux modules

zoneinfo

Le module zoneinfo ajoute la prise en charge de la base de donnée des fuseaux horaires de l'IANA dans la bibliothèque standard. Il ajoute zoneinfo.ZoneInfo, une implémentation concrète de datetime.tzinfo à partir des données de fuseaux horaires du système.

Exemple :

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta

>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'

>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST

As a fall-back source of data for platforms that don't ship the IANA database, the tzdata module was released as a first-party package -- distributed via PyPI and maintained by the CPython core team.

Voir aussi

PEP 615 — Prise en charge de la base de donnée des fuseaux horaires de l'IANA dans la bibliothèque standard

PEP écrit et implémenté par Paul Ganssle

graphlib

Un nouveau module, graphlib, a été ajouté. Il contient la classe graphlib.TopologicalSorter qui offre des fonctionnalités pour faire le tri topologique de graphes (contribution de Pablo Galindo, Tim Peters et Larry Hastings dans bpo-17005).

Modules améliorés

ast

Ajout de l'option indent à dump() qui permet de produire une sortie multi-ligne indentée (contribution de Serhiy Storchaka dans bpo-37995).

Ajout de la fonction ast.unparse() au module ast pour renverser l'analyse syntaxique d'un objet ast.AST et produire une chaîne de code qui produirait un ast.AST équivalent lorsqu'il est analysé (contribution de Pablo Galindo et Batuhan Taskaya dans bpo-38870).

Ajout de chaînes de documentation aux nœuds AST qui contiennent les signatures ASDL utilisées pour construire ce nœud (contribution de Batuhan Taskaya dans bpo-39638).

asyncio

En raison de problèmes de sécurité importants, le paramètre reuse_address de asyncio.loop.create_datagram_endpoint() n'est plus supporté. C'est à cause du comportement de l'option socket SO_REUSEADDR en UDP. Pour plus de détails, voir la documentation de loop.create_datagram_endpoint(). (Contribué par Kyle Stanley, Antoine Pitrou, et Yury Selivanov dans bpo-37228.)

Ajout d'une nouvelle coroutine shutdown_default_executor() qui programme une extinction de l'exécuteur par défaut qui attend que ThreadPoolExecutor se termine. Aussi, asyncio.run() à été mis à jour pour utiliser la nouvelle coroutine. (Contribué par Kyle Stanley dans bpo-34037.)

Ajout de asyncio.PidfdChildWatcher, un surveillant de processus enfants spécifique à Linux qui interroge le descripteur de ficher du processus. (bpo-38692)

Added a new coroutine asyncio.to_thread(). It is mainly used for running IO-bound functions in a separate thread to avoid blocking the event loop, and essentially works as a high-level version of run_in_executor() that can directly take keyword arguments. (Contributed by Kyle Stanley and Yury Selivanov in bpo-32309.)

When cancelling the task due to a timeout, asyncio.wait_for() will now wait until the cancellation is complete also in the case when timeout is <= 0, like it does with positive timeouts. (Contributed by Elvis Pranskevichus in bpo-32751.)

asyncio now raises TypeError when calling incompatible methods with an ssl.SSLSocket socket. (Contributed by Ido Michael in bpo-37404.)

compileall

Ajout de la possibilité d'utiliser des liens physiques pour les fichiers .pyc dupliqués : paramètre hardlink_dupes et option de ligne de commande --hardlink-dupes (contribution de Lumír 'Frenzy' Balhar dans bpo-40495).

Ajout d'options pour manipuler les chemins des fichiers .pyc résultants : paramètres stripdir, prependdir, limit_sl_dest et options de la ligne de commande -s, -p, -e. Ajout de la possibilité de spécifier l'option pour un niveau d'optimisation plus d'une fois (contribution de Lumír 'Frenzy' Balhar dans bpo-38112).

concurrent.futures

Ajout du nouveau paramètre cancel_futures à concurrent.futures.Executor.shutdown() qui annule tous les futurs en attente qui n'ont pas commencé leur exécution, plutôt que d'attendre qu'ils aient complété avant d'arrêter l'exécuteur (contribution Kyle Stanley dans bpo-39349).

Removed daemon threads from ThreadPoolExecutor and ProcessPoolExecutor. This improves compatibility with subinterpreters and predictability in their shutdown processes. (Contributed by Kyle Stanley in bpo-39812.)

Workers in ProcessPoolExecutor are now spawned on demand, only when there are no available idle workers to reuse. This optimizes startup overhead and reduces the amount of lost CPU time to idle workers. (Contributed by Kyle Stanley in bpo-39207.)

curses

Ajout des fonctions curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize(), et curses.set_tabsize() (contribution d'Anthony Sottile dans bpo-38312).

datetime

The isocalendar() of datetime.date and isocalendar() of datetime.datetime methods now returns a namedtuple() instead of a tuple. (Contributed by Donghee Na in bpo-24416.)

distutils

La commande upload crée maintenant des condensats SHA2-256 et Blake2b-256. Elle ne produit pas MD5 sur les plateformes qui bloquent les condensats MD5 (contribution de Christian Heimes dans bpo-40698).

fcntl

Added constants F_OFD_GETLK, F_OFD_SETLK and F_OFD_SETLKW. (Contributed by Donghee Na in bpo-38602.)

ftplib

FTP and FTP_TLS now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

gc

Quand le ramasse-miettes fait un ramassage pour lequel certains objets sont ressuscités (ils sont atteignables à partir de l'extérieur des cycles isolés après que les finaliseurs soient exécutés), le ramassage des objets qui sont toujours inatteignables n'est pas suspendu (contribution de Pablo Galindo et Tim Peters dans bpo-38379).

Ajout de la fonction gc.is_finalized() pour vérifier si un objet a été finalisé par le ramasse-miettes (contribution de Pablo Galindo dans bpo-39322).

hashlib

Le module hashlib peut maintenant utiliser les algorithmes de hachage SHA3 et SHAKE XOF de OpenSSL quand ils sont disponibles (contribution de Christian Heimes dans bpo-37630).

Les modules de hachage natifs peuvent être désactivés avec ./configure --without-builtin-hashlib-hashes ou activés sélectivement avec par exemple ./configure --with-builtin-hashlib-hashes=sha3,blake2 pour forcer l'utilisation de l’implémentation OpenSSL (contribution de Christian Heimes dans bpo-40479).

http

HTTP status codes 103 EARLY_HINTS, 418 IM_A_TEAPOT and 425 TOO_EARLY are added to http.HTTPStatus. (Contributed by Donghee Na in bpo-39509 and Ross Rhodes in bpo-39507.)

IDLE et idlelib

Ajout d'une option pour désactiver le clignotement du curseur (contribution de Zackery Spytz dans bpo-4603).

La fenêtre de complétion de IDLE est maintenant fermée par la touche d'échappement (contribution de Johnny Najera dans bpo-38944).

Ajout de mots clés à la liste de complétion de noms de modules (contribution de Terry J. Reedy dans bpo-37765).

New in 3.9 maintenance releases

IDLE invoque maintenant sys.excepthook() (lorsque lancé sans '-n'). Auparavant, les fonctions de rappel définies par l'utilisateur étaient ignorées (contribution par Ken Hilton dans bpo-43008).

Les changements ci-haut ont été rétro-portés dans la version de maintenance de 3.8.

Rearrange the settings dialog. Split the General tab into Windows and Shell/Ed tabs. Move help sources, which extend the Help menu, to the Extensions tab. Make space for new options and shorten the dialog. The latter makes the dialog better fit small screens. (Contributed by Terry Jan Reedy in bpo-40468.) Move the indent space setting from the Font tab to the new Windows tab. (Contributed by Mark Roseman and Terry Jan Reedy in bpo-33962.)

Applique la coloration syntaxique aux fichiers .pyi (contribution d'Alex Waygood et de Terry Jan Reedy dans bpo-45447).

imaplib

IMAP4 and IMAP4_SSL now have an optional timeout parameter for their constructors. Also, the open() method now has an optional timeout parameter with this change. The overridden methods of IMAP4_SSL and IMAP4_stream were applied to this change. (Contributed by Donghee Na in bpo-38615.)

imaplib.IMAP4.unselect() is added. imaplib.IMAP4.unselect() frees server's resources associated with the selected mailbox and returns the server to the authenticated state. This command performs the same actions as imaplib.IMAP4.close(), except that no messages are permanently removed from the currently selected mailbox. (Contributed by Donghee Na in bpo-40375.)

importlib

Pour plus de cohérence avec les instructions d'import, importlib.util.resolve_name() lève maintenant ImportError plutôt que ValueError pour les tentatives d'import relatifs invalides (contribution de Ngalim Siregar dans bpo-37444).

Les chargeurs d'importation qui publient des objets modules immuables peuvent maintenant aussi publier des paquets immuables en plus des modules individuels (contribution de Dino Viehland dans bpo-39336).

Ajout de la fonction importlib.resources.files() qui prend en charge les sous-répertoires dans les données du paquet. Aussi rétro-porté pour les version précédentes de Python dans importlib_resources version 1.5 (contribution de Jason R. Coombs dans bpo-39791).

Mise à jour de importlib.metadata à partir de importlib_metadata version 1.6.1.

inspect

inspect.BoundArguments.arguments, qui était un OrderedDict, devient un dict natif régulier (contribution de Inada Naoki dans bpo-36350 et bpo-39775).

ipaddress

ipaddress prend désormais en charge les IPv6 avec une portée spécifiée (adresses IPv6 avec un suffixe %<scope_id>).

Les adresses IPv6 avec une portée spécifiée peuvent être analysées avec ipaddress.IPv6Address. S'il est présent, l'indice de la zone de la portée est disponible dans l'attribut scope_id (contribution de Oleksandr Pavliuk dans bpo-34788).

À partir de Python 3.9.5, le module ipaddress n'accepte plus aucun zéro en tête des chaînes de caractères IPv4. (Contribué par Christian Heimes dans bpo-36384).

math

Extension de la fonction math.gcd() pour gérer les arguments multiples. Préalablement, elle ne gérait que deux arguments (contribution de Serhiy Storchaka dans bpo-39648).

Ajout de math.lcm() : renvoie le plus petit commun multiple des arguments spécifiés (contribution de Mark Dickinson, Ananthakrishnan et Serhiy Storchaka dans bpo-39479 et bpo-39648).

Ajout de math.nextafter() : renvoie la prochaine valeur à point flottant après x en direction de y (contribution de Victor Stinner dans bpo-39288).

Ajout de math.ulp() : renvoie la valeur du bit le moins significatif d'un float (contribution de Victor Stinner dans bpo-39310).

multiprocessing

La classe multiprocessing.SimpleQueue a une nouvelle méthode close() pour fermer la queue de façon explicite (contribution de Victor Stinner dans bpo-30966).

nntplib

NNTP and NNTP_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

os

Added CLD_KILLED and CLD_STOPPED for si_code. (Contributed by Donghee Na in bpo-38493.)

Exposed the Linux-specific os.pidfd_open() (bpo-38692) and os.P_PIDFD (bpo-38713) for process management with file descriptors.

La fonction os.unsetenv() est maintenant aussi disponible sur Windows (contribution de Victor Stinner dans bpo-39413).

Les fonctions os.putenv() et os.unsetenv() sont maintenant toujours disponibles (contribution de Victor Stinner dans bpo-39395).

Ajout de la fonction os.waitstatus_to_exitcode() : convertit la valeur de retour de wait() en code de sortie (contribution de Victor Stinner dans bpo-40094).

pathlib

Added pathlib.Path.readlink() which acts similarly to os.readlink(). (Contributed by Girts Folkmanis in bpo-30618)

pdb

Sur Windows, Pdb gère maintenant ~/.pdbrc (contribution de Tim Hopper et Dan Lidral-Porter dans bpo-20523).

poplib

POP3 and POP3_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

pprint

pprint peut maintenant faire l'affichage formaté de types.SimpleNamespace (contribution de Carl Bordum Hansen dans bpo-37376).

pydoc

The documentation string is now shown not only for class, function, method etc, but for any object that has its own __doc__ attribute. (Contributed by Serhiy Storchaka in bpo-40257.)

random

Ajout de la méthode random.Random.randbytes : génère des octets aléatoires (contribution de Victor Stinner dans bpo-40286).

signal

Sur Linux, exposition de signal.pidfd_send_signal() pour envoyer des signaux à un processus en utilisant un descripteur de fichier plutôt qu'un identifiant de processus (pid). (bpo-38712)

smtplib

SMTP and SMTP_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)

LMTP constructor now has an optional timeout parameter. (Contributed by Donghee Na in bpo-39329.)

socket

The socket module now exports the CAN_RAW_JOIN_FILTERS constant on Linux 4.1 and greater. (Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)

The socket module now supports the CAN_J1939 protocol on platforms that support it. (Contributed by Karl Ding in bpo-40291.)

Le module socket possède maintenant les fonctions socket.send_fds() et socket.recv_fds() (contribution de Joannah Nanjekye, Shinya Okano et Victor Stinner dans bpo-28724).

time

On AIX, thread_time() is now implemented with thread_cputime() which has nanosecond resolution, rather than clock_gettime(CLOCK_THREAD_CPUTIME_ID) which has a resolution of 10 milliseconds. (Contributed by Batuhan Taskaya in bpo-40192)

sys

Added a new sys.platlibdir attribute: name of the platform-specific library directory. It is used to build the path of standard library and the paths of installed extension modules. It is equal to "lib" on most platforms. On Fedora and SuSE, it is equal to "lib64" on 64-bit platforms. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

Previously, sys.stderr was block-buffered when non-interactive. Now stderr defaults to always being line-buffered. (Contributed by Jendrik Seipp in bpo-13601.)

tracemalloc

Ajout de tracemalloc.reset_peak() qui affecte la taille d'apogée (la plus grande taille atteinte) du bloc mémoire tracé à la taille courante, pour mesurer la taille d'apogée de parties de code spécifiques (contribution de Huon Wilson dans bpo-40630).

typing

PEP 593 ajoute le type typing.Annotated pour décorer les types existants avec des métadonnées spécifiques au contexte et le nouveau paramètre include_extras à typing.get_type_hints() pour récupérer les métadonnées à l'exécution (contribution de Till Varoquaux et Konstantin Kashin).

unicodedata

La base de donnée Unicode a été mise à jour à la version 13.0.0. (bpo-39926).

venv

Tous les scripts d'activations fournis par venv spécifient maintenant la personnalisation de l'invite de façon cohérente en utilisant toujours la valeur spécifiée dans __VENV_PROMPT__. Précédemment certains scripts utilisaient toujours __VENV_PROMPT__, d'autres seulement quand la variable était affectée, et un utilisait plutôt __VENV_NAME__ (contribution de Brett Cannon dans bpo-37663).

xml

Les caractères d'espacement à l'intérieur des attributs sont maintenant préservés lors de la sérialisation d'xml.etree.ElementTree en fichier XML. Les fin de lignes ne sont plus normalisées par "n". Ceci est le résultat d'une discussion sur comment interpréter la section 2.11 de la spécification XML (contribution de Mefistotelis dans bpo-39011).

Optimisations

  • L'affectation d'une variable temporaire dans les compréhensions est optimisée. Maintenant for y in [expr] dans les compréhensions est aussi rapide qu'une affectation simple y = expr. Par exemple :

    sums = [s for s in [0] for x in data for s in [s + x]]

    Contrairement à l'opérateur :=, cet idiome ne laisse pas déborder une variable dans la portée externe.

    (contribution de Serhiy Storchaka dans bpo-32856).

  • Optimisation de la gestion des signaux dans les applications avec plus d'un fil d'exécution (multithreaded applications). Si un fil d'exécution autre que le fil principal reçoit un signal, la boucle d'évaluation du code intermédiaire (bytecode) n'est plus interrompue à chaque instruction intermédiaire pour vérifier s'il y a des signaux en attente qui ne peuvent être gérés. Seul le fil principal de l'interpréteur principal peut gérer les signaux.

    Précédemment, la boucle d'évaluation du code intermédiaire était interrompue à chaque instruction jusqu'à ce que le fil principal gère les signaux (contribution de Victor Stinner dans bpo-40010).

  • Optimisation du module subprocess sur FreeBSD en utilisant closefrom() (contribution de Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak et Victor Stinner dans bpo-38061).

  • PyLong_FromDouble() is now up to 1.87x faster for values that fit into long. (Contributed by Sergey Fedoseev in bpo-37986.)

  • A number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up by using PEP 590 vectorcall protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207.)

  • Optimisation de difference_update() pour le cas où l'autre set est beaucoup plus grand que celui de base. (Suggestion par Evgeny Kapun et codage contribué par Michele Orrù dans bpo-8425.)

  • L'allocateur de petits objets de Python (obmalloc.c) alloue maintenant (au plus) un aréna vide qui reste disponible pour réutilisation immédiate, sans le renvoyer au système d'exploitation. Ceci prévient l'emballement (thrashing) dans les boucles simples où un aréna pourrait être créé puis détruit à nouveau à chaque itération (contribution de Tim Peters dans bpo-37257).

  • floor division of float operation now has a better performance. Also the message of ZeroDivisionError for this operation is updated. (Contributed by Donghee Na in bpo-39434.)

  • Le décodage de courtes chaînes ASCII avec les codecs UTF-8 et ascii est maintenant 15 % plus rapide (contribution de Inada Naoki dans bpo-37348).

Voici un résumé des améliorations de performance de Python 3.4 à Python 3.9 :

Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

These results were generated from the variable access benchmark script at: Tools/scripts/var_access_benchmark.py. The benchmark script displays timings in nanoseconds. The benchmarks were measured on an Intel® Core™ i7-4960HQ processor running the macOS 64-bit builds found at python.org.

Obsolescence

  • La commande de distutils bdist_msi est maintenant obsolète, utilisez plutôt bdist_wheel (paquet wheel) (contribution de Hugo van Kemenade dans bpo-39586).

  • Présentement, math.factorial() accepte des instances de float qui sont des entiers non-négatifs (comme 5.0). Elle lève une ValueError pour les floats non-entiers et négatifs. Ceci est maintenant obsolète. Les versions futures de Python vont lever une TypeError pour tous les floats (contribution de Serhiy Storchaka dans bpo-37315).

  • The parser and symbol modules are deprecated and will be removed in future versions of Python. For the majority of use cases, users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using the ast module.

  • The Public C API functions PyParser_SimpleParseStringFlags(), PyParser_SimpleParseStringFlagsFilename(), PyParser_SimpleParseFileFlags() and PyNode_Compile() are deprecated and will be removed in Python 3.10 together with the old parser.

  • L'utilisation de NotImplemented dans un contexte booléen est devenu obsolète, puisque c'est presque toujours le résultat d'une implémentation incorrecte des opérateurs de comparaison avancés. Ceci va devenir une TypeError dans les versions futures de Python (contribution de Josh Rosenberg dans bpo-35712).

  • Le module random accepte présentement n'importe quel hachable comme valeur d'ensemencement. Malheureusement, certains de ces types ne garantissent pas une valeur de hachage déterministe. Après Python 3.9, le module va restreindre l'ensemencement à None, int, float, str, bytes et bytearray.

  • Ouvrir un fichier GzipFile en écriture sans spécifier l'argument mode est obsolète. Dans les futures versions de Python, il sera toujours ouvert en lecture par défaut. Spécifiez l'argument mode pour l'ouvrir en écriture et supprimer l'avertissement (contribution de Serhiy Storchaka dans bpo-28286).

  • Deprecated the split() method of _tkinter.TkappType in favour of the splitlist() method which has more consistent and predictable behavior. (Contributed by Serhiy Storchaka in bpo-38371.)

  • Le passage explicite d'objets coroutine à asyncio.wait() est devenu obsolète et sera retiré dans la version 3.11. (Contribution de Yury Selivanov et Kyle Stanley dans bpo-34790.)

  • binhex4 and hexbin4 standards are now deprecated. The binhex module and the following binascii functions are now deprecated:

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

    (contribution de Victor Stinner dans bpo-39353).

  • Les classes slice, Index et ExtSlice du module ast sont considérées obsolètes et seront retirées des versions futures de Python. value doit être utilisé à la place de Index(value). Tuple(slices, Load()) doit être utilisé plutôt que ExtSlice(slices) (contribution de Serhiy Storchaka dans bpo-34822).

  • Les classes Suite, Param, AugLoad et AugStore du module ast sont considérées obsolètes et seront retirées des versions futures de Python. Elles n'étaient pas produites par l'analyseur et n'étaient pas acceptées par le générateur de code dans Python 3 (contribution de Batuhan Taskaya dans bpo-39639 et bpo-39969 et Serhiy Storchaka dans bpo-39988).

  • The PyEval_InitThreads() and PyEval_ThreadsInitialized() functions are now deprecated and will be removed in Python 3.11. Calling PyEval_InitThreads() now does nothing. The GIL is initialized by Py_Initialize() since Python 3.7. (Contributed by Victor Stinner in bpo-39877.)

  • Passer None comme premier argument à la fonction shlex.split() a été rendu obsolète (contribution de Zackery Spytz dans bpo-33262).

  • smtpd.MailmanProxy() is now deprecated as it is unusable without an external module, mailman. (Contributed by Samuel Colvin in bpo-35800.)

  • The lib2to3 module now emits a PendingDeprecationWarning. Python 3.9 switched to a PEG parser (see PEP 617), and Python 3.10 may include new language syntax that is not parsable by lib2to3's LL(1) parser. The lib2to3 module may be removed from the standard library in a future Python version. Consider third-party alternatives such as LibCST or parso. (Contributed by Carl Meyer in bpo-40360.)

  • Le paramètre random de random.shuffle() est maintenant obsolète (contribution de Raymond Hettinger dans bpo-40465).

Retraits

  • The erroneous version at unittest.mock.__version__ has been removed.

  • nntplib.NNTP: xpath() and xgtitle() methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. For xgtitle(), please use nntplib.NNTP.descriptions() or nntplib.NNTP.description() instead. (Contributed by Donghee Na in bpo-39366.)

  • Les méthodes de array.array : tostring() et fromstring() ont été retirées. Elles étaient des alias de tobytes() et frombytes(), obsolètes depuis Python 3.2 (contribution de Victor Stinner dans bpo-38916).

  • La fonction non-documentée sys.callstats() a été retirée. Depuis Python 3.7, elle était obsolète et retournait toujours None. Elle dépendait de l'option de construction CALL_PROFILE qui avait déjà été retirée dans Python 3.7 (contribution de Victor Stinner dans bpo-37414).

  • Les fonctions sys.getcheckinterval() et sys.setcheckinterval() ont été retirées. Elle étaient obsolètes depuis Python 3.2. Utilisez plutôt sys.getswitchinterval() et sys.setswitchinterval() (contribution de Victor Stinner dans bpo-37392).

  • La fonction C PyImport_Cleanup() a été retirée. Elle était documentée comme "Vide la table des modules. Pour usage interne seulement." (contribution de Victor Stinner dans bpo-36710).

  • Les modules _dummy_thread et dummy_threading ont été retirés. Ces modules étaient obsolètes depuis Python 3.7 qui a besoin de la gestion de fils d'exécution multiples (contribution de Victor Stinner dans bpo-37312).

  • aifc.openfp() alias to aifc.open(), sunau.openfp() alias to sunau.open(), and wave.openfp() alias to wave.open() have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in bpo-37320.)

  • The isAlive() method of threading.Thread has been removed. It was deprecated since Python 3.8. Use is_alive() instead. (Contributed by Donghee Na in bpo-37804.)

  • Les méthodes getchildren() et getiterator() des classes ElementTree et Element dans le module ElementTree ont été retirées. Elle avaient été déclarées obsolètes dans Python 3.2. Utilisez iter(x) ou list(x) plutôt que x.getchildren() et x.iter() ou list(x.iter()) plutôt que x.getiterator() (contribution de Serhiy Storchaka dans bpo-36543).

  • L'ancienne API plistlib a été retirée, elle était obsolète depuis Python 3.4. Utilisez les fonctions load(), loads(), dump() et dumps(). De plus, le paramètre use_builtin_types a été retiré, les objets bytes natifs sont toujours utilisés.

  • La fonction C PyGen_NeedsFinalizing a été retirée. Elle n'était pas documentée, testée ou utilisée où que ce soit dans CPython après l'implémentation de PEP 442 (contribution de Joannah Nanjekye dans bpo-15088).

  • base64.encodestring() et base64.decodestring(), des alias obsolètes depuis Python 3.1, ont été retirées : utilisez plutôt base64.encodebytes() et base64.decodebytes() (contribution de Victor Stinner dans bpo-39351).

  • La fonction fractions.gcd() a été retirée, elle était obsolète depuis Python 3.5 (bpo-22486) : utilisez plutôt math.gcd() (contribution de Victor Stinner dans bpo-39350).

  • Le paramètre buffering de la classe bz2.BZ2File a été retiré. Depuis Python 3.0, il était ignoré et son utilisation levait un DeprecationWarning. Passez un objet fichier déjà ouvert pour déterminer comment le fichier sera ouvert (contribution de Victor Stinner dans bpo-39357).

  • Le paramètre encoding de json.loads() a été retiré. À partir de Python 3.1, il était obsolète et ignoré ; son utilisation levait un DeprecationWarning depuis Python 3.8 (contribution de Inada Naoki dans bpo-39377).

  • Les instructions with (await asyncio.lock): et with (yield from asyncio.lock): ne sont plus prises en charge, utilisez plutôt async with lock. De même pour asyncio.Condition et asyncio.Semaphore (contribution de Andrew Svetlov dans bpo-34793).

  • The sys.getcounts() function, the -X showalloccount command line option and the show_alloc_count field of the C structure PyConfig have been removed. They required a special Python build by defining COUNT_ALLOCS macro. (Contributed by Victor Stinner in bpo-39489.)

  • L'attribut _field_types de la classe typing.NamedTuple a été retiré. Il était obsolète depuis Python 3.8. Utilisez plutôt l'attribut __annotations__ (contribution de Serhiy Storchaka dans bpo-40182).

  • The symtable.SymbolTable.has_exec() method has been removed. It was deprecated since 2006, and only returning False when it's called. (Contributed by Batuhan Taskaya in bpo-40208)

  • The asyncio.Task.current_task() and asyncio.Task.all_tasks() have been removed. They were deprecated since Python 3.7 and you can use asyncio.current_task() and asyncio.all_tasks() instead. (Contributed by Rémi Lapeyre in bpo-40967)

  • La méthode unescape() de la classe html.parser.HTMLParser a été retirée (elle était obsolète depuis Python 3.4). html.unescape() doit être utilisée pour convertir les références de caractère en leurs caractères Unicode correspondants.

Portage vers Python 3.9

Cette section liste les changements mentionnés préalablement et d'autres améliorations qui peuvent demander des changements à votre code.

Changements dans l'API Python

  • __import__() et importlib.util.resolve_name() lèvent maintenant ImportError où elles levaient précédemment ValueError. Les appelants qui attrapent les types spécifiques d'exceptions et qui prennent à la fois en charge Python 3.9 et des versions précédentes doivent attraper les deux types avec except (ImportError, ValueError):.

  • Il n'y a plus de traitement spécial dans les scriptes d'activation de venv quand __VENV_PROMPT__ est mis à "".

  • The select.epoll.unregister() method no longer ignores the EBADF error. (Contributed by Victor Stinner in bpo-39239.)

  • Le paramètre compresslevel de bz2.BZ2File est devenu exclusivement nommé (keyword-only) puisque le paramètre buffering a été retiré (contribution de Victor Stinner in bpo-39357).

  • Simplification de l'AST pour l'indiçage. Les indices simples sont représentés par leur valeur, les tranches étendues sont représentées par des n-uplets. Index(value) va renvoyer value elle-même, ExtSlice(slices) va renvoyer Tuple(slices, Load()) (contribution de Serhiy Storchaka dans bpo-34822).

  • Le module importlib ignore maintenant la variable d’environnement PYTHONCASEOK quand les options de ligne de commande -E ou -I sont utilisées.

  • Le paramètre encoding a été ajouté aux classes ftplib.FTP et ftplib.FTP_TLS en paramètre exclusivement nommé et l'encodage par défaut est passé de Latin-1 à UTF-8 en conformité à RFC 2640.

  • asyncio.loop.shutdown_default_executor() a été ajouté à AbstractEventLoop, donc les boucles d'événements alternatives qui héritent de celle-ci devraient définir cette méthode (contribution de Kyle Stanley dans bpo-34037).

  • Les valeurs constantes des drapeaux futurs du module __future__ sont mises à jour pour éviter les collisions avec les drapeaux du compilateur. Précédemment, PyCF_ALLOW_TOP_LEVEL_AWAIT était en collision avec CO_FUTURE_DIVISION (contribution de Batuhan Taskaya dans bpo-39562).

  • array('u') now uses wchar_t as C type instead of Py_UNICODE. This change doesn't affect to its behavior because Py_UNICODE is alias of wchar_t since Python 3.3. (Contributed by Inada Naoki in bpo-34538.)

  • L'API logging.getLogger() renvoie maintenant le journaliseur racine quand on lui passe le nom 'root', alors que préalablement il renvoyait un journaliseur non-racine appelé 'root'. Ceci peut affecter les cas où le code de l'utilisateur veut explicitement un journaliseur non-racine appelé 'root', ou instancie un journaliseur avec logging.getLogger(__name__) dans un module de niveau principal appelé 'root.py' (contribution de Vinay Sajip dans bpo-37742).

  • Division handling of PurePath now returns NotImplemented instead of raising a TypeError when passed something other than an instance of str or PurePath. This allows creating compatible classes that don't inherit from those mentioned types. (Contributed by Roger Aiudi in bpo-34775).

  • Starting with Python 3.9.5 the ipaddress module no longer accepts any leading zeros in IPv4 address strings. Leading zeros are ambiguous and interpreted as octal notation by some libraries. For example the legacy function socket.inet_aton() treats leading zeros as octal notatation. glibc implementation of modern inet_pton() does not accept any leading zeros. (Contributed by Christian Heimes in bpo-36384).

  • codecs.lookup() now normalizes the encoding name the same way as encodings.normalize_encoding(), except that codecs.lookup() also converts the name to lower case. For example, "latex+latin1" encoding name is now normalized to "latex_latin1". (Contributed by Jordon Xu in bpo-37751.)

Changements dans l'API C

  • Les instances de types alloués sur le tas (tels que ceux créés avec PyType_FromSpec() et les APIs similaires) gardent une référence à leur objet type depuis Python 3.8. Tel qu'indiqué dans "Changements à l'API C" de Python 3.8, pour la grande majorité des cas, il ne devrait pas y avoir d'effets secondaires sauf pour les types qui ont une fonction tp_traverse personnalisée. Assurez-vous que toutes les fonctions tp_traverse personnalisées des types alloués sur le tas visitent le type de l'objet.

    Exemple :

    int
    foo_traverse(foo_struct *self, visitproc visit, void *arg) {
    // Rest of the traverse function
    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (Python issue 35810 and 40217)
        Py_VISIT(Py_TYPE(self));
    #endif
    }
    

    Si votre fonction de traversée délègue à la tp_traverse de sa classe mère (ou d'un autre type), assurez-vous que Py_TYPE(self) ne soit visité qu'une seule fois. Prenez note que seuls les types du tas doivent visiter leur type dans tp_traverse.

    Par exemple, si votre fonction tp_traverse inclut :

    base->tp_traverse(self, visit, arg)
    

    alors ajoutez :

    #if PY_VERSION_HEX >= 0x03090000
        // This was not needed before Python 3.9 (bpo-35810 and bpo-40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // a heap type's tp_traverse already visited Py_TYPE(self)
        } else {
            Py_VISIT(Py_TYPE(self));
        }
    #else
    

    (Voir bpo-35810 et bpo-40217 pour plus d'information.)

  • Les fonctions PyEval_CallObject, PyEval_CallFunction, PyEval_CallMethod et PyEval_CallObjectWithKeywords sont obsolètes. Utilisez plutôt PyObject_Call() et ses variantes. (Pour plus de détails, voir bpo-29548.)

Changements au code intermédiaire CPython

  • Le code d'opération LOAD_ASSERTION_ERROR a été ajouté pour gérer l'instruction assert. Précédemment, l'instruction assert ne fonctionnait pas correctement si l'exception AssertionError était masquée (contribution de Zackery Spytz dans bpo-34880).

  • Le code d'opération COMPARE_OP a été séparé en quatre instructions distinctes :

    • COMPARE_OP pour les comparaisons avancées ;

    • IS_OP pour les tests is et is not ;

    • CONTAINS_OP pour les tests in et not in ;

    • JUMP_IF_NOT_EXC_MATCH pour vérifier les exceptions dans les instructions try-except.

    (contribution de Mark Shannon dans bpo-39156).

Changements à la compilation

  • Added --with-platlibdir option to the configure script: name of the platform-specific library directory, stored in the new sys.platlibdir attribute. See sys.platlibdir attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

  • La macro spéciale de compilation COUNT_ALLOCS a été retirée (contribution de Victor Stinner dans bpo-39489).

  • On non-Windows platforms, the setenv() and unsetenv() functions are now required to build Python. (Contributed by Victor Stinner in bpo-39395.)

  • Sur les plateformes non-Windows, la création d'installateurs bdist_wininst n'est maintenant officiellement plus pris en charge. (Voir bpo-10945 pour plus de détails.)

  • When building Python on macOS from source, _tkinter now links with non-system Tcl and Tk frameworks if they are installed in /Library/Frameworks, as had been the case on older releases of macOS. If a macOS SDK is explicitly configured, by using --enable-universalsdk or -isysroot, only the SDK itself is searched. The default behavior can still be overridden with --with-tcltk-includes and --with-tcltk-libs. (Contributed by Ned Deily in bpo-34956.)

  • Python peut maintenant être compilé pour Windows 10 ARM64 (contribution de Steve Dower dans bpo-33125).

  • Certains tests individuels sont maintenant ignorés lorsque --pgo est utilisé. Les tests en question augmentaient la durée de la tâche PGO de manière significative et n'optimisaient probablement pas l'exécutable final. Cela accélère la tâche par un facteur d'environ 15 fois. Le fait de lancer la suite de tests est lent. Ce changement va peut être avoir pour conséquence des exécutables compilés un peu moins optimisés car moins de branches de code seront exécutées. Si vous souhaitez attendre avec une compilation plus lente, l'ancienne manière de fonctionner peut être obtenue avec ./configure [..] PROFILE_TASK="-m test --pgo-extended". Nous ne garantissons pas quel set de tâches PGO produira une compilation plus rapide. Les utilisateurs qui s'y intéressent devraient exécuter leurs propres benchmarks, car les résultats peuvent dépendre de l'environnement, de la charge de travail et de la chaîne d'outils du compilateur. (Voir bpo-36044 et bpo-37707 pour plus de détails.)

Changements à l'API C

Nouvelles fonctionnalités

  • PEP 573: Added PyType_FromModuleAndSpec() to associate a module with a class; PyType_GetModule() and PyType_GetModuleState() to retrieve the module and its state; and PyCMethod and METH_METHOD to allow a method to access the class it was defined in. (Contributed by Marcel Plch and Petr Viktorin in bpo-38787.)

  • Ajout de la fonction PyFrame_GetCode() : récupérer le code d'un cadre. Ajout de la fonction PyFrame_GetBack() : récupérer le prochain cadre englobant (contribution de Victor Stinner dans bpo-40421).

  • Ajout de PyFrame_GetLineNumber() à l'API C limité (contribution de Victor Stinner dans bpo-40421).

  • Ajout des fonctions PyThreadState_GetInterpreter() et PyInterpreterState_Get() pour récupérer l'interpréteur. Ajout de la fonction PyThreadState_GetFrame() pour récupérer le cadre de l'état d'un fil d'exécution Python. Ajout de la fonction PyThreadState_GetID() : récupérer l'identifiant unique de l'état d'un fil d'exécution Python (contribution de Victor Stinner dans bpo-39947).

  • Ajout de la nouvelle fonction publique PyObject_CallNoArgs() à l'API C, qui appelle un objet Python appelable sans aucun argument. C'est la façon la plus efficace d'appeler un objet Python appelable sans aucun argument (contribution de Victor Stinner dans bpo-37194).

  • Changements dans l'API C limité (si la macro Py_LIMITED_API est définie) :

    • Fournit Py_EnterRecursiveCall() et Py_LeaveRecursiveCall() comme fonctions régulières pour l'API limité. Précédemment, elles étaient définies en tant que macros, mais ces macros n'étaient pas compilées avec l'API C limité qui ne peut pas accéder au champ PyThreadState.recursion_depth (la structure est opaque à l'API C limité) ;

    • PyObject_INIT() et PyObject_INIT_VAR() deviennent des fonctions "opaques" régulières pour cacher les détails d'implémentation

    (contribution de Victor Stinner dans bpo-38644 et bpo-39542).

  • The PyModule_AddType() function is added to help adding a type to a module. (Contributed by Donghee Na in bpo-40024.)

  • Ajout des fonctions PyObject_GC_IsTracked() et PyObject_GC_IsFinalized() à l'API publique qui déterminent respectivement si les objets Python sont présentement suivis ou ont été finalisés par le ramasse-miettes (contribution de Pablo Galindo Salgado dans bpo-40241).

  • Added _PyObject_FunctionStr() to get a user-friendly string representation of a function-like object. (Patch by Jeroen Demeyer in bpo-37645.)

  • Ajout de PyObject_CallOneArg() pour appeler un objet avec un argument positionnel. (Rustine par Jeroen Demeyer dans bpo-37483.)

Portage vers Python 3.9

  • PyInterpreterState.eval_frame (PEP 523) nécessite maintenant un nouveau paramètre obligatoire tstate (PyThreadState*) (contribution de Victor Stinner dans bpo-38500).

  • Modules d'extension : les fonctions m_traverse, m_clear et m_free de PyModuleDef ne sont plus appelées si l'état du module est demandé mais qu'il n'a pas encore été alloué. C'est le cas immédiatement après que le module a été créé et avant que le module soit exécuté (fonction Py_mod_exec). Plus précisément, ces fonctions ne sont pas appelées si m_size est plus grand que 0 et que l'état du module (tel que renvoyé par PyModule_GetState()) est NULL.

    Les modules d'extensions sans état de module (m_size <= 0) ne sont pas affectés.

  • Si Py_AddPendingCall() est appelée dans un sous-interpréteur, la fonction est planifiée pour appel dans le sous-interpréteur, plutôt que dans l'interpréteur principal. Chaque sous interpréteur a maintenant sa propre liste d'appels planifiés (contribution de Victor Stinner dans bpo-39984).

  • Le registre de Windows n'est plus utilisé pour initialiser sys.path quand l'option -E est utilisée (si PyConfig.use_environment est affecté à 0). Ceci est pertinent quand Python est embarqué sur Windows (contribution de Zackery Spytz dans bpo-8901).

  • La variable globale PyStructSequence_UnnamedField est maintenant une constante et fait référence à une chaîne constante (contribution de Serhiy Storchaka dans bpo-38650).

  • The PyGC_Head structure is now opaque. It is only defined in the internal C API (pycore_gc.h). (Contributed by Victor Stinner in bpo-40241.)

  • The Py_UNICODE_COPY, Py_UNICODE_FILL, PyUnicode_WSTR_LENGTH, PyUnicode_FromUnicode(), PyUnicode_AsUnicode(), _PyUnicode_AsUnicode, and PyUnicode_AsUnicodeAndSize() are marked as deprecated in C. They have been deprecated by PEP 393 since Python 3.3. (Contributed by Inada Naoki in bpo-36346.)

  • La fonction Py_FatalError() est remplacée par une macro qui ajoute automatiquement une entrée au journal avec le nom de la fonction courante, sauf si la macro Py_LIMITED_API est définie (contribution de Victor Stinner dans bpo-39882).

  • Le protocole vectorcall requiert maintenant que l'appelant ne passe que des chaînes pour les noms des arguments nommés. (Voir bpo-37540 pour plus d'informations.)

  • Les détails d'implémentation de certaines macros et fonctions sont maintenant cachés :

    (Voir bpo-40170 pour plus de détails.)

Retraits

  • Exclusion des macros PyFPE_START_PROTECT() et PyFPE_END_PROTECT() de l'API C limité (contribution de Victor Stinner dans bpo-38835).

  • Le champ tp_print de PyTypeObject a été retiré. Il était utilisé pour écrire des objets dans des fichiers dans Python 2.7 et dans les versions précédentes. Depuis Python 3.0, il était ignoré et inutilisé (contribution de Jeroen Demeyer dans bpo-36974).

  • Changements dans l'API C limité (si la macro Py_LIMITED_API est définie) :

    • Exclusion des fonctions suivantes de l'API C limité :

      • PyThreadState_DeleteCurrent() (contribution de Joannah Nanjekye dans bpo-37878) ;

      • _Py_CheckRecursionLimit ;

      • _Py_NewReference() ;

      • _Py_ForgetReference() ;

      • _PyTraceMalloc_NewReference() ;

      • _Py_GetRefTotal() ;

      • Le mécanisme trashcan qui n'a jamais fonctionné dans l'API C limité ;

      • PyTrash_UNWIND_LEVEL ;

      • Py_TRASHCAN_BEGIN_CONDITION ;

      • Py_TRASHCAN_BEGIN ;

      • Py_TRASHCAN_END ;

      • Py_TRASHCAN_SAFE_BEGIN ;

      • Py_TRASHCAN_SAFE_END.

    • Migration des fonctions et définitions suivantes vers l'API C interne :

      • _PyDebug_PrintTotalRefs() ;

      • _Py_PrintReferences() ;

      • _Py_PrintReferenceAddresses() ;

      • _Py_tracemalloc_config ;

      • _Py_AddToAllObjects() (spécifique aux compilations Py_TRACE_REFS).

    (contribution de Victor Stinner dans bpo-38644 et bpo-39542).

  • Retrait de la fonction de rappel _PyRuntime.getframe et de la macro _PyThreadState_GetFrame qui était un alias pour _PyRuntime.getframe. Elles étaient exposées uniquement dans l'API C interne. Retrait aussi du type PyThreadFrameGetter (contribution de Victor Stinner dans bpo-39946).

  • Retrait des fonctions suivantes de l'API C. Appelez PyGC_Collect() explicitement pour vider toutes les free lists (contribution de Inada Naoki et Victor Stinner dans bpo-37340, bpo-38896 et bpo-40428) :

    • PyAsyncGen_ClearFreeLists() ;

    • PyContext_ClearFreeList() ;

    • PyDict_ClearFreeList() ;

    • PyFloat_ClearFreeList() ;

    • PyFrame_ClearFreeList() ;

    • PyList_ClearFreeList() ;

    • PyMethod_ClearFreeList() et PyCFunction_ClearFreeList() : les free lists des objets méthode liées ont été retirées ;

    • PySet_ClearFreeList() : la free list des objets sets a été retirée dans Python 3.4 ;

    • PyTuple_ClearFreeList() ;

    • PyUnicode_ClearFreeList() : la free list des objets Unicode a été retirée dans Python 3.3.

  • Retrait de la fonction _PyUnicode_ClearStaticStrings() (contribution de Victor Stinner dans bpo-39465).

  • Retrait de Py_UNICODE_MATCH. Elle était devenue obsolète par PEP 393, non-fonctionnelle depuis Python 3.3. La fonction PyUnicode_Tailmatch() peut être utilisée à sa place (contribution de Inada Naoki dans bpo-36346).

  • Nettoyage dans les fichiers d'en-têtes d'interfaces déclarées pour lesquelles il n'y avait pas d'implémentation. Les symboles retirés de l'API publique sont : _PyBytes_InsertThousandsGroupingLocale, _PyBytes_InsertThousandsGrouping, _Py_InitializeFromArgs, _Py_InitializeFromWideArgs, _PyFloat_Repr, _PyFloat_Digits, _PyFloat_DigitsInit, PyFrame_ExtendStack, _PyAIterWrapper_Type, PyNullImporter_Type, PyCmpWrapper_Type, PySortWrapper_Type, PyNoArgsFunction (contribution de Pablo Galindo Salgado dans bpo-39372).

Changements importants dans Python 3.9.1

typing

Le comportement de typing.Literal a été changé pour être conforme avec PEP 586 et pour avoir le comportement des vérificateurs de types statique spécifiés dans le PEP :

  1. Literal de-duplique maintenant les paramètres ;

  2. Les comparaisons d'égalité entre les objets Literal sont maintenant indépendantes de l'ordre ;

  3. Les comparaisons des Literal respectent maintenant les types. Par exemple, Literal[0] == Literal[False] évaluait précédemment à True. C'est maintenant False. Pour gérer ce changement, le cache interne des types utilisés peut maintenant différentier les types ;

  4. Les objets Literal lèvent maintenant une exception TypeError lors des comparaisons d'égalités si n'importe quel de leurs paramètres n'est pas immuable. Prenez-note que déclarer un Literal avec un paramètre mutable ne lève pas une erreur :

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

(Contribution de Yurii Karabas dans bpo-42345.)

Prise en charge de macOS 11.0 (Big Sur) et de Mac sur processeur Apple

Depuis la version 3.9.1, Python est maintenant totalement compatible (compilation et lancement) sur macOS 11.0 (Big Sur) et sur les Macs Apple Silicon (basés sur l'architecture ARM64). Un nouveau variant de build, universal2, est maintenant disponible et supporte nativement les plateformes ARM64 et Intel 64 en un seul jeu d'exécutables. Les binaires peuvent aussi être compilés sur les versions actuelles de macOS pour ensuite être déployés sur des versions antérieures (testé jusqu'à 10.9), tout en rendant de nouvelles fonctionnalités du système d'exploitation disponibles en fonction de la version du système utilisée à l'exécution ("weaklinking").

(contribution de Ronald Oussoren et Lawrence D'Anna dans bpo-41100).

Changements importants dans Python 3.9.2

collections.abc

collections.abc.Callable generic now flattens type parameters, similar to what typing.Callable currently does. This means that collections.abc.Callable[[int, str], str] will have __args__ of (int, str, str); previously this was ([int, str], str). To allow this change, types.GenericAlias can now be subclassed, and a subclass will be returned when subscripting the collections.abc.Callable type. Code which accesses the arguments via typing.get_args() or __args__ need to account for this change. A DeprecationWarning may be emitted for invalid forms of parameterizing collections.abc.Callable which may have passed silently in Python 3.9.1. This DeprecationWarning will become a TypeError in Python 3.10. (Contributed by Ken Jin in bpo-42195.)

urllib.parse

Earlier Python versions allowed using both ; and & as query parameter separators in urllib.parse.parse_qs() and urllib.parse.parse_qsl(). Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with & as the default. This change also affects cgi.parse() and cgi.parse_multipart() as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)

Notable changes in Python 3.9.3

A security fix alters the ftplib.FTP behavior to not trust the IPv4 address sent from the remote server when setting up a passive data channel. We reuse the ftp server IP address instead. For unusual code requiring the old behavior, set a trust_server_pasv_ipv4_address attribute on your FTP instance to True. (See gh-87451)

Notable changes in Python 3.9.5

urllib.parse

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline \n, \r and tab \t characters are stripped from the URL by the parser in urllib.parse preventing such attacks. The removal characters are controlled by a new module level variable urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (See gh-88048)

Notable security feature in 3.9.14

Converting between int and str in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a ValueError if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the algorithmic complexity. This is a mitigation for CVE 2020-10735. This limit can be configured or disabled by environment variable, command line flag, or sys APIs. See the integer string conversion length limitation documentation. The default limit is 4300 digits in string form.

Notable changes in 3.9.17

tarfile

  • The extraction methods in tarfile, and shutil.unpack_archive(), have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show a DeprecationWarning. In Python 3.14, the default will switch to 'data'. (Contributed by Petr Viktorin in PEP 706.)