veilletech.fr
13 oct. Feed du jour
#04 PYTHON Article

Python 3.15 : UTF-8 par défaut, imports paresseux

La mise à jour qui casse, c'est celle que vos tests en ASCII ne voient pas.

Python 3.15.0 est sorti le 9 octobre 2026, avec une semaine de retard après une troisième release candidate. Le changement qui touche le plus de code est le mode UTF-8 activé par défaut, surtout sous Windows. Viennent ensuite le mot-clé lazy pour les imports, frozendict, sentinel et le dépaquetage dans les compréhensions.

4 min de lectureintermédiairevidéo 1:26
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. UTF-8 devient le défaut
  3. Imports paresseux
  4. Les autres nouveautés
  5. Comment s'y prendre
  6. À retenir

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 :

Python
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é :

Python
lazy import json
import sys

def main():
    if "--json" in sys.argv:
        print(json.dumps({"status": "ok"}))   # json est chargé ici, pas avant

Dans 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

Comment s'y prendre

  1. Dans un environnement de test, lancer la suite avec -X warn_default_encoding et relire chaque EncodingWarning.
  2. Rejouer de vrais imports et exports, avec des accents.
  3. Pour les imports paresseux, vérifier initialisations et enregistrements qui dépendaient d'un effet de bord à l'import.
  4. Si le projet supporte encore Python 3.14, ne pas mettre lazy ni 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.