Se rendre au contenu

Python 3.12 est sorti

3 octobre 2023 par
Python 3.12 est sorti
Makersquad

Date de sortie : 2 octobre 2023

Documentation officielle : What’s New in Python 3.12

Python 3.12 simplifie drastiquement le typage. Fini TypeVar('T'), place à def foo[T](). Les f-strings deviennent aussi beaucoup plus flexibles. Et les performances continuent de s’améliorer — les compréhensions sont 2× plus rapides.


Les nouveautés principales

Nouvelle syntaxe pour les génériques — enfin lisible

Déclaration simplifiée des types génériques :

# Avant
from typing import TypeVar, Generic

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, item: T) -> None:
        self.item = item

# Après
class Box[T]:
    def __init__(self, item: T) -> None:
        self.item = item

Pour les fonctions :

def first[T](items: list[T]) -> T:
    return items[0]


Instruction type pour les alias

type Point = tuple[float, float]
type Vector[T] = list[T]


F-strings libérés

Les restrictions artificielles sautent :

# Réutilisation des quotes
f"Items: {", ".join(items)}"

# Multi-ligne avec commentaires
f"""Result: {
    compute_value()  # calcul complexe
}"""

# Backslashes autorisés
f"Path: {'\\n'.join(paths)}"

# Imbrication arbitraire
f"{f"{f"{value}"}"}"


Décorateur @override

Indiquer explicitement qu’une méthode surcharge une méthode parente :

from typing import override

class Child(Parent):
    @override
    def process(self) -> None:
        ...  # Erreur si Parent n'a pas de méthode process


TypedDict pour **kwargs

Typer les keyword arguments :

from typing import TypedDict, Unpack

class Options(TypedDict):
    timeout: int
    retries: int

def fetch(url: str, **kwargs: Unpack[Options]) -> str:
    ...


Performance

  • Compréhensions 2x plus rapides (inlining)
  • asyncio 75% plus rapide
  • isinstance() contre Protocols 2-20x plus rapide
  • tokenize 64% plus rapide


itertools.batched() — grouper par lots

from itertools import batched

list(batched("ABCDEFG", 3))
# [('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]


pathlib.Path.walk()

Enfin un walk() dans pathlib :

from pathlib import Path

for root, dirs, files in Path(".").walk():
    for file in files:
        print(root / file)


Suppression de distutils

distutils est supprimé. Utilisez setuptools ou des alternatives modernes comme hatch, flit, pdm.


Autres améliorations

  • math.sumprod() — somme de produits
  • sqlite3 avec CLI et meilleur contrôle des transactions
  • GIL par sous-interpréteur (API C uniquement)
  • sys.monitoring pour debuggers/profilers low-overhead

Échanger avec un expert Python

Nous revenons vers vous sous 24h.


Chez Makersquad, nous mettons notre expertise Python au service de projets ambitieux et durables. Que ce soit pour le développement d’applications web, la conception d’API, l’automatisation de processus, la data ou l’optimisation de performances, nous accompagnons nos clients à chaque étape. Si vous avez un besoin en Python, un nouveau projet, une refonte, un audit: notre équipe est prête à vous aider à concevoir des solutions robustes, évolutives et maintenables.


À retenir

Python 3.12 modernise sérieusement le système de types. La nouvelle syntaxe class Foo[T] et type Point = ... rendent le code générique enfin agréable à lire. C’est aussi la release qui prépare le terrain pour le GIL optionnel (3.13).

FastAPI 0.100 est sorti
Support de Pydantic v2