Перейти к содержанию

Практикум: ядро и необязательные интеграции

Пример к статье «Ядро без зависимостей». Проверяем, что работает без extra и какие операции становятся доступны после его установки.

Запуск

С установленным uv выполните из корня репозитория сайта:

cd docs/blog/lab/2026-09-07-zero-dependency-cores
uv run --no-project --python 3.13 python footprint.py

Самому скрипту достаточно стандартной библиотеки. Он создаёт три временных окружения Python 3.13 без pip и без доступа к пакетам вызывающего окружения, устанавливает зависимости через uv pip с constraints.txt и запускает проверки в новых процессах. Пути учитывают Windows и POSIX. Docker и внешний HTTP-сервис не нужны; для загрузки Python и пакетов нужен доступ к сети. После проверок временные окружения удаляются.

Проверки

Установка Утверждение
deadline-budget==0.1.3 Только один пакет; бюджет работает без clientwright и веб-библиотек
clientwright==0.5.0 Только один пакет; настройки, реестр и таблица возможностей работают без HTTP-библиотек
httpx отсутствует build("httpx", config) выдаёт ошибку с подсказкой clientwright[httpx]
clientwright[httpx]==0.5.0 Настоящий локальный HTTP-запрос, тип и закрытие клиента; deadline-budget ещё не установлен
Бюджет приложения отсутствует Импорт budget_flow.py завершается ошибкой, обязательный дедлайн не отключается незаметно
clientwright[httpx,deadline]==0.5.0 Тот же HTTP-запрос передаёт не больше 500 мс вместо двух секунд из настроек
servicewright==0.13.1 Только один пакет; импорт FastAPI-адаптера называет нужный extra
servicewright[fastapi]==0.13.1 Адаптер импортируется, объект точки входа создаётся

Три базовые установки независимы. Extras HTTP и дедлайна последовательно добавляются в окружение clientwright, а FastAPI в окружение servicewright. --constraint фиксирует версии, не устанавливая посторонние пакеты. Ошибка команды или несовпадение утверждения приводит к неуспешному завершению скрипта. У дочерних процессов и HTTP-операций есть ограничения времени.

Проверка servicewright охватывает установку и создание точки входа. Полный запуск сервиса проверяется в практикуме совместного использования библиотек. Тестовый склад только записывает заголовок дедлайна; серверное ограничение времени он не реализует.

Дополнительные измерения

uv run --no-project --python 3.13 python footprint.py --measure --report footprint-results.json

Каждый запуск печатает число дистрибутивов и размер site-packages для каждого этапа. --report сохраняет их в JSON, а --measure добавляет замеры импорта. JSON-отчёт содержит время UTC, платформу, версию Python, полный список установленных пакетов с версиями, размер файлов site-packages в МиБ, пять замеров импорта и их медиану для каждого этапа установки. В число пакетов входит сама библиотека. Размер считается как сумма длин файлов вместе с заранее скомпилированным байткодом, а не объём скачанных wheel-файлов или выделенного места на диске. Пакеты ставятся с --compile-bytecode, поэтому компиляция исходников в замеры импорта не попадает; проверки запускаются с -B, чтобы не создавать новый байткод.

Каждый замер импортирует корневой модуль в новом процессе. Запуск интерпретатора в замер не входит, файловый кеш ОС остаётся активным, все необязательные интеграции не загружаются. Это наблюдения в конкретном окружении, а не рейтинг производительности. Проверки поведения не требуют точных значений времени или размера. Отчёт записывается только после успеха всех сценариев.

Файлы

  • warehouse_policy.py: настройки, которые импортируют только clientwright.
  • http_flow.py: HTTP-операция с этими настройками.
  • budget_flow.py: та же операция с обязательным бюджетом deadline-budget.
  • probe.py: проверки отсутствия пакетов, сообщений об ошибках и локального HTTP-запроса.
  • footprint.py: временные окружения, установка, дочерние процессы и отчёт.
  • constraints.in и constraints.txt: выбранные интеграции и зафиксированные версии зависимостей.

Для обновления версий измените constraints.in и версии в footprint.py, пересоберите файл ограничений и повторите практикум. Сохранённый файл подготовлен для Python 3.13 на разных платформах; маркеры платформы по-прежнему определяют, какие пакеты будут установлены.