Вышел!
Вижу только одно большое изменение, с учетом которого мы будем писать код, это "Type Parameter Syntax”, о котором был пост год назад. TL;DR: больше не нужен typing.TypeVar:
def max[T](args: Iterable[T]) -> T: …
def max_number[T: (int, float)](args: Iterable[T]) -> T: …
Еще одно значительное изменение, но которое мы будем читать и писать не так часто, это создание type aliases:
# вот так теперь не надо
# Point = tuple[float, float]
# Point: TypeAlias = tuple[float, float]
# надо вот так
type Point = tuple[float, float]
type Point[T] = tuple[T, T]
# пример для ценителей:
type RecursiveList[T] = T | list[RecursiveList[T]]
Небольшая мелочь, о которой хорошим тоном будет знать, если в вашем коде есть наследования классов: typing.override (аналог override из C++) для маркировки методов, который переопределяют метод базового класса.
Остальные изменения меньше повлияют на написание/чтение среднего мэйснтримного кода, полный список изменений доступен тут:
https://docs.python.org/3.12/whatsnew/3.12.html
P.S.
На правах админа порадуюсь такой мелочи как pathlib.Path.walk :)
Из той же серии видел как разработчики в интернетах радуются добавлению itertools.batched