diff --git a/pydantic_settings/sources/base.py b/pydantic_settings/sources/base.py index 4ead04aa..a5ec7e5d 100644 --- a/pydantic_settings/sources/base.py +++ b/pydantic_settings/sources/base.py @@ -268,8 +268,9 @@ def __init__( init_kwarg_name = init_kwarg_names & set(alias_names) if init_kwarg_name: preferred_alias = alias_names[0] + preferred_set_alias = next(alias for alias in alias_names if alias in init_kwarg_name) init_kwarg_names -= init_kwarg_name - self.init_kwargs[preferred_alias] = init_kwargs[init_kwarg_name.pop()] + self.init_kwargs[preferred_alias] = init_kwargs[preferred_set_alias] self.init_kwargs.update({key: val for key, val in init_kwargs.items() if key in init_kwarg_names}) super().__init__(settings_cls) diff --git a/tests/test_settings.py b/tests/test_settings.py index 5f9c544a..867e83dd 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -699,6 +699,16 @@ class Example(BaseSettings): assert Example(name='john', PREFIX_SURNAME='doe').model_dump() == {'name': 'john', 'last_name': 'doe'} +def test_init_kwargs_alias_resolution_deterministic(): + class Example(BaseSettings): + name: str + last_name: str = Field(validation_alias=AliasChoices('surname', 'last_name')) + + result = Example(name='john', surname='doe', last_name='smith').model_dump() + + assert result == {'name': 'john', 'last_name': 'doe'} + + def test_alias_nested_model_default_partial_update(): class SubModel(BaseModel): v1: str = 'default'