Python 3.15 и уход 3.10: обновление интерпретатора по календарю

Python 3.15 принёс lazy import (PEP 810), у 3.10 кончилась поддержка. Разбираем, что это даёт бизнесу и как обновлять стек по календарю.

  • Что принёс Python 3.15
  • Зачем бизнесу ленивые импорты
  • Что означает уход 3.10
  • Как мы обновляем стек

Повод

В октябре вышел Python 3.15, и в том же месяце закончилась пятилетняя поддержка Python 3.10. Саймон Уиллисон, автор Datasette и десятков open source-библиотек, подвёл итог так: теперь в своих проектах он может пользоваться возможностями 3.11. Компании, у которой бизнес-логика написана на Python, из этих двух событий стоит вынести одно правило: обновление интерпретатора планируют по календарю.

Команда, которая откладывает его до инцидента, теряет скорость, исправления безопасности и доступ к новым версиям библиотек.

Что принёс Python 3.15

  1. Руководство What's new в этом году готовил

  2. Хьюго ван Кеменаде, релиз-менеджер версий 3.14 и 3.15.

  3. Уиллисон больше всего ждал явных ленивых импортов из PEP 810: ```python lazy import json lazy from pathlib import Path ```

  4. Интерпретатор регистрирует имя, но загружает модуль только при первом обращении к нему.

  5. Если программа в этом запуске до `json` не дошла, модуль не загрузится.

  6. Вторая заметная новинка - профилировщик, который подключается к уже работающему процессу по PID.

  7. Уиллисон в тот же день выпустил datasette-ports 0.4: плагин находит запущенные на машине экземпляры Datasette и теперь показывает PID каждого, чтобы к нему было проще подключить профилировщик.

  8. Сопровождающий библиотеки потратил на поддержку новой возможности считаные часы, и так обычно и выглядит экосистема, которая готовилась к релизу заранее.

Зачем бизнесу ленивые импорты

  1. Время старта заметно там, где процесс запускается часто и живёт недолго: CLI-утилиты, задачи по cron, serverless-функции, инструменты, которые AI-агент вызывает десятки раз за сессию.

  2. Тяжёлые библиотеки вроде pandas, SDK облачных провайдеров и клиентов LLM импортируются при каждом запуске, даже если конкретному вызову они не нужны.

  3. Сколько это стоит в вашем коде, показывает команда `python -X importtime`.

  4. Сначала измерьте, потом обещайте ускорение: результат сильно зависит от проекта.

  5. До PEP 810 команды прятали импорты внутрь функций.

  6. Приём работал, но портил читаемость, путал линтеры и разбрасывал зависимости по файлу.

  7. Теперь зависимость объявляется в начале модуля, а время на загрузку тратится только при использовании. У механизма есть риск, о котором стоит знать до миграции.

  8. Ленивый импорт переносит ошибку импорта и побочные эффекты модуля на момент первого обращения.

  9. Если библиотека при импорте регистрирует плагины или патчит стандартные функции, поведение программы изменится.

  10. Сломанная зависимость раньше роняла процесс при старте, а теперь упадёт в продакшене на редкой ветке кода.

  11. Поэтому `lazy` расставляют вместе с тестами, которые проходят эти ветки.

Разобрать ваш контур интеграции

Что означает уход 3.10

  1. Каждая версия Python получает пять лет исправлений, в последние годы - только исправления безопасности. С октября 2026 года 3.10 не получает и их.

  2. Сопровождающие библиотек, как Уиллисон, убирают 3.10 из тестов и переходят на синтаксис 3.11. Компания, которая осталась на 3.10, постепенно застрянет на старых версиях зависимостей и будет закрывать уязвимости своими силами. Есть и прямые потери.

  3. По данным python.org, Python 3.11 в среднем примерно на 25% быстрее 3.10 благодаря проекту Faster CPython.

  4. Версия 3.11 вышла в октябре 2022 года. Команда, которая до сих пор работает на 3.10, четыре года не забирала ускорение, ради которого не нужно переписывать бизнес-логику. В 3.11 также появились группы исключений с `except*`, встроенный парсер TOML `tomllib` и сообщения об ошибках с указанием точного места в строке.

  5. Последнее сокращает время разбора инцидентов.

Как мы обновляем стек

В KT.Team на Python работают интеграционные сервисы: коннекторы к 1С и маркетплейсам, консьюмеры Apache Kafka, RAG-пайплайны, LLM & Security Gateway.

Наш редакционный агент news-machine - тоже Python-процесс, его systemd запускает по таймеру несколько раз в день. У долгоживущих сервисов вроде консьюмеров Kafka версия интерпретатора влияет на пропускную способность и расход CPU. У короткоживущих процессов вроде news-machine и CLI-инструментов к этому добавляется время старта.

Порядок у нас такой. ### CI-матрица на две версии

Тесты идут на минимальной поддерживаемой и на последней версии Python

В день нового релиза мы добавляем его в матрицу, и несовместимости видны до того, как придётся переходить. ###

Окно миграции после релиза В октябре выходит релиз, в ноябре и декабре мы переводим сервисы. Версию, у которой кончается поддержка, убираем из продакшена до даты окончания поддержки. ### Замер до и после

Меряем `importtime`, время ответа и потребление памяти.

Если метрика не сдвинулась, мы тоже получили ответ: узкое место в другом месте, и тратить на старт время незачем. ### Агенты на рутине миграции

Замену устаревших API, правку конфигов и прогон тестов по десяткам репозиториев выполняют AI-агенты под контролем инженера.

Уиллисон в те же дни через Codex собрал с телефона небольшое веб-приложение web-edit, чтобы править файлы с секретами, не передавая их модели.

Механическую работу инженер отдаёт агенту, а решение, что пускать в продакшен, принимает сам.

Вывод

`lazy import json` занимает одну строку, но за ней стоят CI-матрица, тесты на редкие ветки, замер старта и календарь миграций. Компания без такого процесса получает новые возможности языка с опозданием на годы и рискует встретить инцидент безопасности на неподдерживаемой версии. Команда с отлаженным процессом проверит зависимости на 3.15 в этом квартале, переведёт сервисы и посчитает, сколько миллисекунд и рублей сэкономило обновление.

Обсудить статью: Python 3.15 и уход 3.10: обновление…

Укажите email или телефон, чтобы мы могли вам ответить.

Отправить через: