Задать вопрос
mksmvnv
@mksmvnv
Backend Developer

Почему не работает pydantic-settings SettingsConfigDict(yaml_file)?

Вот мой конфиг упрощенно:

from pathlib import Path
from pydantic_settings import BaseSettings, SettingsConfigDict

CONFIG_PATH = Path(__file__).parent / "config.yaml"

class Settings(BaseSettings):
    db_url: str

    model_config = SettingsConfigDict(
        yaml_file=CONFIG_PATH,
    )


settings = Settings()
print(settings.db_url)

Почему не парсится YAML? Ручками через open в контекстном менеджере все ок. Вроде бы в SettingsConfigDict через именованный аргумент yaml_file можно сократить логику, но у меня падает ошибка, якобы pydantic не может прочесть мой конфиг. Хотя он читается без проблем и существует.

YAML:

db_url: "sqlite+aiosqlite://"

Traceback:

Traceback (most recent call last):
  File "/.../src/config/config.py", line 16, in <module>
    settings = Settings()
  File "/.../.venv/lib/python3.13/site-packages/pydantic_settings/main.py", line 188, in __init__
    super().__init__(
    ~~~~~~~~~~~~~~~~^
        **__pydantic_self__._settings_build_values(
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<27 lines>...
        )
        ^
    )
    ^
  File "/.../.venv/lib/python3.13/site-packages/pydantic/main.py", line 253, in __init__
    validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self)
pydantic_core._pydantic_core.ValidationError: 1 validation error for Settings
db_url
  Field required [type=missing, input_value={}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.11/v/missing
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
Wispik
@Wispik
Не смотрел исходники pydantic_settings, но с ходу у меня тоже не получилось подружить его с yaml файлами. Поэтому у меня в проекте вот так работает:
сначала устанавливаем pyyaml:
pip install pyyaml
дальше:
import yaml

class Settings(BaseSettings):
    db_url: str

    @classmethod
    def from_yaml(cls, path: str):
        with open(path, 'r') as f:
            data = yaml.safe_load(f)
        return cls(**data)

settings = Settings.from_yaml('test.yaml')
print(settings.db_url)
Ответ написан
mksmvnv
@mksmvnv Автор вопроса
Backend Developer
в общем срабатывает только после переопределения метода settings_customise_sources, вот так:

@classmethod
    def settings_customise_sources(
        cls,
        settings_cls: Type[BaseSettings],
        init_settings: PydanticBaseSettingsSource,
        env_settings: PydanticBaseSettingsSource,
        dotenv_settings: PydanticBaseSettingsSource,
        file_secret_settings: PydanticBaseSettingsSource,
    ) -> Tuple[PydanticBaseSettingsSource, ...]:
        return (YamlConfigSettingsSource(settings_cls),)

устанавливаем источник YamlConfigSettingsSource, как приоритетный
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы