Практикум: ядро и необязательные интеграции¶
Пример к статье «Ядро без зависимостей». Проверяем, что работает без 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 охватывает установку и создание точки входа. Полный запуск сервиса проверяется в практикуме совместного использования библиотек. Тестовый склад только записывает заголовок дедлайна; серверное ограничение времени он не реализует.
Дополнительные измерения¶
Каждый запуск печатает число дистрибутивов и размер 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 на разных платформах; маркеры платформы по-прежнему определяют, какие пакеты будут установлены.