Я использую Pydantic v2 с BaseSettings (pydantic-settings) для загрузки конфигураций из переменных среды. Однако я столкнулся с проблемой, когда переменные среды, похоже, переопределяют аргументы инициализации, даже если я ожидаю, что аргументы инициализации будут иметь приоритет.
Вот упрощенная версия моего кода:
from pydantic import Field, StrictStr
from pydantic_settings import BaseSettings, SettingsConfigDict
class MySettings(BaseSettings):
api_key: StrictStr = Field(..., alias="TEST_API_KEY")
aws_region: StrictStr = Field(..., alias="AWS_REGION")
model_config = SettingsConfigDict(extra="ignore", populate_by_name=True)
# .env file
# TEST_API_KEY="TEST_API_KEY_VALUE"
# AWS_REGION="us-east-1"
print(MySettings().model_dump())
# Expected: {'api_key': 'TEST_API_KEY_VALUE', 'aws_region': 'us-east-1'}
print(MySettings(api_key="ANOTHER_API_KEY_TO_OVERRIDE").model_dump())
# Expected: {'api_key': 'ANOTHER_API_KEY_TO_OVERRIDE', 'aws_region': 'us-east-1'}
# Actual: {'api_key': 'TEST_API_KEY_VALUE', 'aws_region': 'us-east-1'}
print(MySettings(api_key=111).model_dump())
# Expected: ValidationError due to type mismatch
# Actual: {'api_key': 'TEST_API_KEY_VALUE', 'aws_region': 'us-east-1'}
Я также пробовал настроить SettingsConfigDict и использовать собственный PydanticBaseSettingsSource, но поведение сохраняется. Отладка самой базы кода Pydantic показывает наличие как конструктора, так и значений среды, но последнее имеет приоритет из-за сопоставления псевдонимов (возможно).
Мой вопрос в основном заключается в том, как я могу гарантировать, что аргументы инициализации имеют приоритет над переменными среды при использовании псевдонимов в настройках pydantic?
Python 3.11.8 (arm64)
pydantic==2.7.1
pydantic-settings==2.2.1
pydantic_core==2.18.2
Подробнее здесь: https://stackoverflow.com/questions/785 ... th-aliases