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

Почему не работает 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
  • Вопрос задан
  • 20 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
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)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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