НОВОСТИ

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

На этой странице 4 раздела

Python-приложение может читать число повторных попыток из файла, токен доступа из переменной окружения, а временное переопределение — из кода. Нужны понятные правила, определяющие, какой источник важнее. Долгоживущий сервис может также менять настройки после запуска: новые значения должны проходить те же проверки и не раскрывать секреты в сообщениях об ошибках.

Pydantic Settings, Dynaconf и Hydra предоставляют развитые средства загрузки и переопределения. Но они не объединяют в одном объекте выбор источников для отдельных полей, согласованные изменения после запуска, явные конфликты, обработчики изменений и безопасные для секретов ошибки.

skelet — конфигурационная Python-библиотека для настроек, которые могут меняться после загрузки. Она описывает источники каждого значения, их приоритет, правила проверки и действия после изменения. Связанные обновления согласуются между собой, конфликтующие настройки можно запретить, а секретные значения скрываются из стандартных ошибок. Релиз доступен на GitHub.

Валидируемые изменения во время выполнения

Класс Storage объявляет типизированные поля. Значения могут приходить из аргументов конструктора, переменных окружения, TOML — включая pyproject.toml, — JSON, YAML или памяти. Источники упорядочены, и выигрывает первый, в котором найдено значение. Отдельные поля могут заменить или расширить этот общий порядок.

from skelet import EnvSource, Field, Storage, TOMLSource

class Settings(
    Storage,
    sources=[
        EnvSource(prefix="my_app_"),
        TOMLSource("pyproject.toml", table="tool.my_app"),
    ],
):
    retries: int = Field(3, validation=lambda value: value >= 0)
    api_token: str = Field("", secret=True)

settings = Settings()
settings.retries = 5       # После загрузки действуют те же проверки.
settings.retries = -1      # Поднимает ValueError; сохранённым остаётся 5.

Здесь переменные окружения приоритетнее TOML-таблицы, а та — значений полей по умолчанию. Последующее присваивание всё равно проходит проверки типа и значения.

До сохранения skelet умеет преобразовать значение, проверить его тип и запустить дополнительные проверки. Поле можно сделать доступным только для чтения, снабдить описанием или альтернативным именем либо объявить несовместимым с другим полем. Успешное изменение может вызвать заданную функцию. Связанные записи согласуются между собой, но это не транзакция базы данных: изменение содержимого уже сохранённого объекта обходит проверки, а ошибка обработчика не отменяет присваивание.

Работа с секретными значениями

secret=True скрывает поле в представлении хранилища и стандартных ошибках skelet. Он не шифрует значение, не управляет доступом и не получает секреты из vault; код приложения всё ещё может его раскрыть.

Сравнение с развитыми инструментами конфигурации

Эти проекты предлагают более развитые возможности загрузки: вложенные модели, ввод из командной строки, удалённые хранилища секретов, иерархическую композицию и перезагрузку настроек. Typed Settings — ещё один вариант с комбинируемыми источниками и автоматически созданным интерфейсом командной строки. Более узкая специализация skelet — изменяемые поля после загрузки: согласованные записи, явные конфликты и функции, вызываемые при присваивании.

Пакет предназначен для библиотек, сервисов и долгоживущих инструментов, чьи настройки одновременно загружаются из нескольких мест и законно меняются после создания объекта. Если достаточно неизменяемого снимка при старте, более узкий loader может быть лучшим выбором.

Что дальше

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