Python 3.15 a franchi le 1er septembre 2026 sa dernière étape avant publication : la release candidate 3.15.0rc2, désormais figée en fonctionnalités. La version finale est attendue le 1er octobre. Au programme, trois changements structurants pour le back-end web : des imports paresseux explicites, l’UTF-8 imposé par défaut et un compilateur JIT nettement retravaillé.
Une release candidate déjà figée
La rc2 clôt la phase de développement : plus aucune fonctionnalité ne sera ajoutée et l’ABI reste stable jusqu’à la sortie finale. Elle regroupe environ 144 correctifs remontés depuis la rc1, signe d’un cycle désormais concentré sur la stabilisation.
| Jalon | Date | Portée |
|---|---|---|
| 3.15.0rc1 | Août 2026 | Gel des fonctionnalités |
| 3.15.0rc2 | 1er septembre 2026 | Dernière RC, ABI figée, ~144 correctifs |
| 3.15.0 finale | 1er octobre 2026 | Version de production |
Pour les équipes qui exploitent des services Python en production, la fenêtre de test se referme : c’est le moment de valider ses dépendances contre la RC, avec les mêmes réflexes de mise en production (service géré par systemd, reverse proxy) que pour n’importe quel back-end.
PEP 810 : des imports paresseux, mais explicites
Le changement le plus visible est l’arrivée d’un mot-clé contextuel lazy. Un module marqué comme paresseux n’est chargé qu’au premier accès à l’un de ses attributs, ce qui réduit la latence de démarrage et l’empreinte mémoire des applications qui importent beaucoup sans tout utiliser.
lazy import json
lazy from pathlib import Path
print("...") # json et pathlib pas encore charges
data = json.loads('{"cle": "valeur"}') # json est charge ici
racine = Path(".") # pathlib est charge iciUn mode de compatibilité existe via la variable __lazy_modules__, utile pour rendre paresseux des imports sans réécrire chaque ligne. Le gain est particulièrement net sur les programmes en ligne de commande, dont le temps de lancement pèse à chaque invocation — un terrain déjà exploré du côté de l’outillage CLI.
La contrepartie tient dans le mot « explicite » : contrairement à un mécanisme automatique, PEP 810 laisse le développeur décider, import par import. Les effets de bord déclenchés à l’import — enregistrement de greffons, ouverture de connexions — ne doivent surtout pas être rendus paresseux sans analyse.
UTF-8 par défaut : la fin d’une source de bugs silencieux
Avec PEP 686, Python utilise désormais l’UTF-8 comme encodage par défaut, indépendamment de l’environnement du système. Un appel comme open('donnees.txt') lit en UTF-8 sans configuration, ce qui met fin aux écarts de comportement entre un poste de développement et un serveur dont la locale diffère.
Le comportement historique reste accessible : PYTHONUTF8=0 ou l’option -X utf8=0 réactivent l’encodage dépendant de la locale, le temps de migrer les rares scripts qui en dépendaient.
Un fichier ouvert sans préciser l’encodage se lit désormais en UTF-8, quel que soit le serveur : la principale cause d’écarts entre environnements disparaît.
Un JIT retravaillé et deux nouveaux types natifs
Le compilateur JIT, introduit à titre expérimental dans les versions précédentes, a été « nettement amélioré » selon les notes de version, qui font état de gains de l’ordre de 8 à 13 % selon les plateformes. Les binaires Windows 64 bits adoptent par ailleurs l’interpréteur à appels terminaux. Comme d’autres écosystèmes qui misent sur la vitesse d’exécution — à l’image du compilateur natif de TypeScript — Python cherche à réduire le coût de l’interprétation.
Côté types, deux ajouts entrent dans builtins : frozendict, dictionnaire immuable et hachable (PEP 814), et sentinel, pour créer des valeurs sentinelles uniques à la représentation lisible (PEP 661).
>>> config = frozendict(hote="db.interne", port=5432)
>>> config["port"]
5432
>>> config["port"] = 5433
TypeError: 'frozendict' object does not support item assignmentPoint de vigilance. Les imports paresseux déplacent le coût du chargement au premier accès : une exception d’import ne surgit plus au démarrage, mais au milieu de l’exécution. Sur un service web, une erreur de configuration détectée au boot peut ainsi se transformer en incident en production. À réserver aux modules lourds et sans effet de bord.
Ce qu’il faut retenir
- Python 3.15 est figé depuis la rc2 du 1er septembre ; la version finale sort le 1er octobre 2026.
- PEP 810 apporte des imports paresseux explicites (
lazy import), efficaces sur le démarrage des outils et des applications. - PEP 686 impose l’UTF-8 par défaut, réversible via
PYTHONUTF8=0. - Le JIT progresse et
frozendict/sentinelrejoignent les types natifs.
Les imports paresseux sont la fonctionnalité que j’attendais le plus, mais aussi celle qui demande le plus de discipline. Sur mes propres services, je ne les activerai que sur les modules coûteux et vérifiés sans effet de bord : un import qui échoue en pleine requête plutôt qu’au démarrage, c’est le genre de surprise qu’on paie cher un vendredi soir. — Simon Janvier
Source primaire : « What’s New In Python 3.15 », documentation officielle, et les notes de la release candidate 3.15.0rc2.
