Python 3.15 добавляет ленивые импорты и новые встроенные типы
Октябрьская ветка меняет запуск больших приложений, работу с неизменяемыми словарями и профилирование. Новые импорты включаются явно.

Импорт можно объявить и выполнить позже
Python 3.15 вышел 9 октября. Одна из наиболее заметных возможностей — явные ленивые импорты с мягким ключевым словом lazy. Программа может перечислить зависимости в начале модуля, но фактически загрузить библиотеку при первом обращении к импортированному имени. Это адресовано приложениям с большим деревом зависимостей: например, справка командного инструмента не обязательно должна загружать всё, что понадобится одной из его редких подкоманд. Обычный import сохраняет прежнее поведение. Подробная спецификация PEP 810 разделяет объявление отложенного имени и момент превращения его в настоящий объект, поэтому новшество касается выполнения, а не только удобного синтаксиса.
Когда выполняется код модуля
Отложенная загрузка переносит и побочные эффекты верхнего уровня: регистрацию обработчиков, заполнение реестра или чтение конфигурации. Если импортированное имя не используется, этот код может не выполниться вовсе. Ошибка отсутствующей зависимости также возникает при первом обращении, а не во время объявления импорта. PEP описывает совместимость с обычной загрузкой и поведение в многопоточной среде. Синтаксис предназначен для уровня модуля; его нельзя произвольно поместить внутрь функции или блока обработки исключений. Для программ, поддерживающих более старые версии Python, предусмотрен список __lazy_modules__, позволяющий описать желаемое поведение без нового ключевого слова в исходнике. Глобальный режим и фильтр дают дополнительное управление, но не меняют обычные импорты без включения соответствующего режима.
Словарь, который нельзя изменить
Встроенный frozendict сохраняет отображение ключей в значения, но запрещает изменение после создания. Он не является подклассом dict и может использоваться как хешируемое значение, если сами ключи и значения допускают хеширование. Порядок вставки сохраняется при обходе, однако не определяет равенство словарей. Это готовый тип для неизменяемых настроек и значений, которые раньше часто приходилось оформлять вручную. Другой новый встроенный тип, sentinel, представляет уникальное значение-маркер с понятным отображением. Оно полезно там, где None — допустимое содержимое и нужно отдельно обозначить отсутствие аргумента. В стандартной библиотеке обновлена поддержка новых типов; это отличает их от локального класса, известного только одному приложению.
Профилирование и варианты интерпретатора
Ветка 3.15 собирает средства профилирования в отдельном пространстве profiling и добавляет статистический профилировщик Tachyon. Он снимает образцы стеков работающего процесса, а не инструментирует каждый вызов функции. В документации различаются прошедшее время, активный CPU и время удержания GIL, поскольку эти измерения отвечают на разные вопросы. Среди других изменений — UTF-8 по умолчанию, стабильный ABI для свободнопоточных сборок и обновления экспериментального JIT. Официальные 64-битные Windows-сборки используют интерпретатор с хвостовыми вызовами, а macOS-поставка включает поддержку свободных потоков по умолчанию. При этом основной релиз 3.15.0 уже сменился исправлениями 3.15.2: описание возможностей относится к ветке, а выбирать загрузку следует по актуальному корректирующему выпуску этой ветки.


