Python 3.15.0b1 вышел в feature freeze, а значит, список нововведений уже известен. Самые громкие — это lazy imports и tachyon profiler, но и мелких улучшений набралось много.
В asyncio появился метод TaskGroup.cancel(). Раньше, чтобы прервать выполнение группы задач извне, приходилось городить костыли с кастомным исключением и contextlib.suppress. Теперь достаточно вызвать tg.cancel() — и группа завершится без лишних ошибок и ExceptionGroup.
Контекстные менеджеры, которые используются как декораторы, наконец-то починили. Раньше @duration не работал с асинхронными функциями, генераторами и корутинами — декоратор завершался сразу, не дожидаясь их полного жизненного цикла. В Python 3.15 ContextDecorator сам определяет тип оборачиваемой функции и корректно перекрывает весь её жизненный цикл. Автор считает, что теперь контекстные менеджеры — лучший способ писать декораторы.
Ещё одна долгожданная фича — потокобезопасные итераторы. По умолчанию итераторы не рассчитаны на многопоточность: при параллельной итерации можно получить пропущенные значения или сломанное внутреннее состояние. Теперь есть threading.serialize_iterator, который оборачивает любой итератор в потокобезопасную версию. threading.synchronized_iterator делает то же самое, но как декоратор для генераторной функции. А threading.concurrent_tee дублирует значения в несколько независимых итераторов для параллельной обработки.
В collections.Counter добавили операцию xor (^). Симметрическая разница: из пересечения вычитается объединение — остаются элементы, которые есть только в одном из счётчиков. Применение на практике, конечно, неочевидное, но для полноты пригодится.
Наконец, с появлением frozendict в стандартной библиотеке, можно теперь парсить JSON прямо в неизменяемые структуры. Функции json.load и json.loads получили параметр array_hook, который работает аналогично object_hook. Теперь можно передать array_hook=tuple, object_hook=frozendict и сразу получить хэшируемый объект.