Aller au contenu
Makersquad

Python 3.15 est sorti

par Makersquad ·

Logo de Python sur fond dégradé

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 forme pkg.mod:callable au 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 : TypedDict avec é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 encoding explicite utilisent désormais UTF-8. PYTHONUTF8=0 ou -X utf8=0 rétablit l’ancien comportement.
  • .pth et .start (PEP 829) : les lignes import des fichiers .pth sont dépréciées en silence, et ignorées quand un fichier .start correspondant existe.
  • sqlite3 : tous les paramètres de sqlite3.connect() sauf database deviennent nommés obligatoirement. Les trois premiers paramètres de create_function() et de create_aggregate(), et le premier de set_authorizer(), set_progress_handler() et set_trace_callback(), deviennent positionnels uniquement.
  • argparse : avec add_argument('-f', '-foo'), dest vaut maintenant 'foo' au lieu de 'f'. Passez dest explicitement pour garder l’ancien nom.
  • unittest : assertWarns() et assertWarnsRegex() 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. Passez padded=True pour l’exiger.
  • datetime : strptime() lève ValueError quand le format contient %d sans 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émentez exec_module().
  • ast : les constructeurs de nœuds lèvent TypeError quand un argument obligatoire manque ou qu’un mot-clé ne correspond à aucun champ.

Retraits

  • http.server : la classe CGIHTTPRequestHandler et l’option --cgi.
  • Les modules sre_compile, sre_constants et sre_parse.
  • typing : la syntaxe par mots-clés de NamedTuple (NamedTuple("Point", x=int, y=int)), TypedDict("TD") et TypedDict("TD", None) sans champ, no_type_check_decorator et ByteString dans __all__ (idem pour collections.abc).
  • glob.glob0() et glob.glob1() : utilisez glob.glob() avec root_dir.
  • zipimporter.load_module(), PurePath.is_reserved(), platform.java_ver(), ctypes.SetPointerType(), codeobject.co_lnotab, getmark(), setmark() et getmarkers() du module wave.
  • 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.

Échanger avec un expert Python

De l’idée au marché. Makersquad conçoit des logiciels sur mesure, pensés pour durer, avec de petites équipes d’experts autonomes. Depuis 2018.