Ce qui se passe
Python 3.15.0 est disponible depuis le 9 octobre 2026. Les notes de version comptent 5 643 commits de 1 012 contributeurs. La sortie a pris une semaine de retard : le 2 octobre, le release manager Hugo van Kemenade a ajouté une troisième release candidate, parce que des erreurs sur les imports paresseux bloquaient encore la publication.
Cette fiche suit le compte rendu de heise Developer, en allemand. Les faits cités se recoupent dans les notes de version de python.org et dans les PEP mentionnés plus bas.
UTF-8 devient le défaut
C'est le changement le plus lourd de conséquences, et il n'ajoute aucune syntaxe.
Le mode UTF-8 (PEP 686) est actif par défaut : un open() sans argument
encoding lit et écrit en UTF-8, au lieu de suivre la locale du système. Les
programmes Windows qui supposaient une page de code locale sont les premiers
concernés.
Les fichiers déjà écrits ne sont pas reconvertis. Un ancien export en Windows-1252 doit toujours être lu avec son encodage :
with open("altbestand.csv", encoding="cp1252") as f:
texte = f.read()Pour garder l'encodage du système, passer encoding="locale". Pour couper le
mode : PYTHONUTF8=0 ou -X utf8=0. Avant de migrer, lancer l'interpréteur
avec -X warn_default_encoding : chaque open() sans encodage lève un
EncodingWarning. Des tests purement ASCII peuvent passer alors que les
accents d'un vieux fichier posent problème, d'où l'intérêt d'essayer de vraies
données d'import et d'export.
Imports paresseux
Le mot-clé « souple » lazy (PEP 810) retarde le chargement d'un module jusqu'à
la première utilisation du nom importé :
lazy import json
import sys
def main():
if "--json" in sys.argv:
print(json.dumps({"status": "ok"})) # json est chargé ici, pas avantDans sa propre mesure sur un Apple M4, heise passe de 44 ms à 11 ms pour un
script qui importe 13 modules de la bibliothèque standard et n'affiche qu'une
ligne. Contraintes : lazy ne s'écrit qu'au niveau du module, pas dans une
fonction, une classe ou un try, ni avec import *. Un module manquant ne se
voit plus qu'au premier accès, et les effets de bord de l'import changent de
moment. PYTHON_LAZY_IMPORTS=all rend paresseux presque tous les imports de
niveau module, pour essayer sans réécrire.
Les autres nouveautés
frozendict: dictionnaire immuable, hachable quand ses valeurs le sont, donc utilisable comme clé ou comme argument d'unfunctools.lru_cache. Il n'est pas plus rapide qu'undict. Seule la correspondance est figée : une liste contenue reste modifiable.sentinel(PEP 661) : une valeur-témoin nommée, à la place duobject()anonyme, pour distinguer « argument absent » deNone.- Dépaquetage en compréhension (PEP 798) :
[*lot for lot in lots]aplatit,{**couche for couche in couches}fusionne des dictionnaires. - Profilage : le paquet
profilingregroupeprofiling.tracing(l'anciencProfile, qui reste un alias) etprofiling.sampling, avec le profileur statistique Tachyon, qui échantillonne 1 000 fois par seconde et s'attache à un processus en cours, en général avec les droits root. Le moduleprofileest déprécié, retrait prévu en 3.17. - JIT : toujours expérimental et désactivé par défaut (
PYTHON_JIT=1). Gain géométrique de 7 à 8 % sur Linux x86-64 face à l'interpréteur sans JIT, de 11 à 12 % sur macOS Apple, avec des benchmarks individuels de −15 % à +100 %. - Windows : les binaires 64 bits officiels utilisent l'interpréteur à appels terminaux, 15 à 20 % de gain sur pyperformance. Les binaires macOS installent désormais aussi la variante sans GIL.
Comment s'y prendre
- Dans un environnement de test, lancer la suite avec
-X warn_default_encodinget relire chaqueEncodingWarning. - Rejouer de vrais imports et exports, avec des accents.
- Pour les imports paresseux, vérifier initialisations et enregistrements qui dépendaient d'un effet de bord à l'import.
- Si le projet supporte encore Python 3.14, ne pas mettre
lazyni le dépaquetage en compréhension dans des fichiers partagés.
Un point pour les Mac : IDLE et les programmes Tkinter peuvent se figer à l'ouverture d'un dialogue depuis un menu sous macOS 27, d'après la page de version. La cause est un changement du système, pas de Python 3.15 ; un contournement est dans les branches de développement de Tk (CPython n° 158053), sans correctif publié.
Calendrier : correctifs environ tous les deux mois pendant deux ans, puis mises à jour de sécurité jusqu'en octobre 2031 environ.
Source (en allemand) : Python 3.15 erschienen: Faule Importe, UTF-8 und neue Datentypen, heise Developer, 12 octobre 2026. Notes de version : python.org.