Конфиги часто воспринимаются как статические файлы, которые загружают и забывают. Однако в production именно мутация конфига или невалидные данные приводят к трудноотловимым багам, гонкам данных и внезапным падениям после деплоя. Разберем три практики, которые делают конфигурацию надежной в Python 3.11+.
Immutable Config после загрузки
После инициализации конфиг не должен изменяться. Избегайте глобальных словарей, которые кто-то может дописать по ходу работы. Используйте Pydantic v2 с frozen=True или dataclass с slots. Это защищает от случайной мутации и гарантирует, что все зависимости от конфига будут зафиксированы на старте. В асинхронных сервисах это критично — одновременное чтение и запись из нескольких корутин легко ломает логику.
Hot-reload через inotify без боли
Для сервисов с uptime 24/7 перезапуск ради смены таймаута или уровня логирования излишен. Используйте watchdog, который через inotify отслеживает изменения файла конфига. Вешайте FileSystemEventHandler на конкретный файл, а не на директорию, чтобы избежать ложных срабатываний. Типичная ошибка: обработчик срабатывает на незаконченную запись, когда файл очищается перед перезаписью. Решение — загружать конфиг атомарно (через write-and-rename) или проверять, что в конфиге есть все обязательные поля, через try-except.
Версионирование схем для обратной совместимости
Новая версия сервиса не должна падать из-за старого конфига или наоборот. Используйте наследование от базовой модели ConfigV1, где поле version — обязательное. При загрузке сверяйте версию и подставляйте нужную модель-наследник с добавленными полями. В Pydantic v2 параметр extra="forbid" отсекает мусорные ключи, а строгая валидация типов ловит несоответствия еще до старта приложения. Пример:
class ConfigV2(ConfigV1): new_field: str.Практический совет
Храните файлы конфигов отдельно от кода (например, в Consul или AWS Parameter Store), а в CI добавьте шаг валидации через pydantic + pyyaml. Это предотвратит попадание невалидных конфигов в прод даже до деплоя.
Предупреждение
Не смешивайте конфиги с переменными окружения без структуры: pydantic-settings для env хорош, но забывают, что переменные окружения — тоже часть конфигурации, и их необходимо версионировать вместе со схемой.
Вывод: Неизменяемость конфига после загрузки, атомарный hot-reload и версионирование схем через Pydantic v2 — три кита, которые делают конфигурацию предсказуемой и защищают production от сбоев, связанных с некорректными данными.