Python 3.15 est sorti
par Makersquad ·
Date de sortie : 9 octobre 2026
Documentation officielle : What’s New in Python 3.15
Python 3.15 est sorti le 9 octobre 2026. Cette version accélère le démarrage grâce aux imports paresseux, ajoute deux nouveaux types natifs (frozendict et sentinel), passe à UTF-8 par défaut et livre un profileur statistique à haute fréquence.
Les nouveautés principales
Imports paresseux (PEP 810)
Le mot-clé souple lazy retarde le chargement d’un module jusqu’à la première utilisation du nom. Les temps de démarrage s’en trouvent réduits.
lazy import json
lazy from pathlib import Path
Nouveaux types natifs
La PEP 814 ajoute frozendict, un mapping immuable et hashable, qui n’est pas une sous-classe de dict. La PEP 661 ajoute le type natif sentinel, pour créer des valeurs sentinelles uniques avec une représentation concise.
Évolutions du langage
- Décompression dans les compréhensions (PEP 798) : les compréhensions de listes, d’ensembles, de dictionnaires et les expressions génératrices acceptent
*et**.
flat = [*L for L in lists]
- Fichiers
.start(PEP 829) : ils déclarent des points d’entrée de la formepkg.mod:callableau démarrage.
Profilage
La PEP 799 introduit un paquet profiling dédié. Il contient Tachyon (profiling.sampling), un profileur statistique capable d’échantillonner jusqu’à 1 000 000 Hz. Le compilateur JIT expérimental a aussi été nettement amélioré, et les messages d’erreur comme la couleur en ligne de commande progressent.
Typage
- PEP 728 :
TypedDictavec éléments supplémentaires typés. - PEP 747 : annotation des formes de types avec
TypeForm. - PEP 800 : bases disjointes dans le système de types.
API C et build
La PEP 782 ajoute l’API PyBytesWriter pour construire des objets bytes, et la PEP 788 protège contre la finalisation de l’interpréteur. Les PEP 803, 820 et 793 apportent l’ABI stable pour les builds sans GIL (abi3t). Les pointeurs de frame sont activés par défaut sur les plateformes prises en charge (PEP 831).
Changements incompatibles
Les notes listent une vingtaine de changements susceptibles de casser du code. Les principaux :
Comportement modifié
- UTF-8 par défaut (PEP 686) : les entrées-sorties sans
encodingexplicite utilisent désormais UTF-8.PYTHONUTF8=0ou-X utf8=0rétablit l’ancien comportement. .pthet.start(PEP 829) : les lignesimportdes fichiers.pthsont dépréciées en silence, et ignorées quand un fichier.startcorrespondant existe.sqlite3: tous les paramètres desqlite3.connect()saufdatabasedeviennent nommés obligatoirement. Les trois premiers paramètres decreate_function()et decreate_aggregate(), et le premier deset_authorizer(),set_progress_handler()etset_trace_callback(), deviennent positionnels uniquement.argparse: avecadd_argument('-f', '-foo'),destvaut maintenant'foo'au lieu de'f'. Passezdestexplicitement pour garder l’ancien nom.unittest:assertWarns()etassertWarnsRegex()n’avalent plus les avertissements qui ne correspondent pas à la catégorie ou à l’expression. Des avertissements jusque-là masqués peuvent apparaître.base64:urlsafe_b64decode()n’exige plus le remplissage. Passezpadded=Truepour l’exiger.datetime:strptime()lèveValueErrorquand le format contient%dsans année.importlib:Loader.load_module()est supprimée et le système d’import ne l’appelle plus sur les sous-classes personnalisées. Implémentezexec_module().ast: les constructeurs de nœuds lèventTypeErrorquand un argument obligatoire manque ou qu’un mot-clé ne correspond à aucun champ.
Retraits
http.server: la classeCGIHTTPRequestHandleret l’option--cgi.- Les modules
sre_compile,sre_constantsetsre_parse. typing: la syntaxe par mots-clés deNamedTuple(NamedTuple("Point", x=int, y=int)),TypedDict("TD")etTypedDict("TD", None)sans champ,no_type_check_decoratoretByteStringdans__all__(idem pourcollections.abc).glob.glob0()etglob.glob1(): utilisezglob.glob()avecroot_dir.zipimporter.load_module(),PurePath.is_reserved(),platform.java_ver(),ctypes.SetPointerType(),codeobject.co_lnotab,getmark(),setmark()etgetmarkers()du modulewave.mmap.mmap.resize()sur les plateformes dont le système ne fournit pas l’appel sous-jacent.
Un nouveau type à accepter
frozendict n’est pas une sous-classe de dict. Le code qui teste isinstance(arg, dict) et doit aussi accepter le nouveau type écrit isinstance(arg, (dict, frozendict)), ou teste collections.abc.Mapping.
À retenir
Python 3.15 accélère le démarrage avec les imports paresseux, ajoute frozendict et sentinel et livre le profileur Tachyon. Le point à vérifier en premier avant de migrer est l’UTF-8 par défaut pour les fichiers ouverts sans encoding.