Skip to content

Commit 0497ef2

Browse files
enrico-staussEnrico StaussEnrico Stauss
authored
Make InitSettingsSource resolution deterministic (#681)
Co-authored-by: Enrico Stauss <enrico.stauss@pace.de> Co-authored-by: Enrico Stauss <enrico_sta@web.de>
1 parent c22cef4 commit 0497ef2

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

pydantic_settings/sources/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,9 @@ def __init__(
268268
init_kwarg_name = init_kwarg_names & set(alias_names)
269269
if init_kwarg_name:
270270
preferred_alias = alias_names[0]
271+
preferred_set_alias = next(alias for alias in alias_names if alias in init_kwarg_name)
271272
init_kwarg_names -= init_kwarg_name
272-
self.init_kwargs[preferred_alias] = init_kwargs[init_kwarg_name.pop()]
273+
self.init_kwargs[preferred_alias] = init_kwargs[preferred_set_alias]
273274
self.init_kwargs.update({key: val for key, val in init_kwargs.items() if key in init_kwarg_names})
274275

275276
super().__init__(settings_cls)

tests/test_settings.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,16 @@ class Example(BaseSettings):
699699
assert Example(name='john', PREFIX_SURNAME='doe').model_dump() == {'name': 'john', 'last_name': 'doe'}
700700

701701

702+
def test_init_kwargs_alias_resolution_deterministic():
703+
class Example(BaseSettings):
704+
name: str
705+
last_name: str = Field(validation_alias=AliasChoices('surname', 'last_name'))
706+
707+
result = Example(name='john', surname='doe', last_name='smith').model_dump()
708+
709+
assert result == {'name': 'john', 'last_name': 'doe'}
710+
711+
702712
def test_alias_nested_model_default_partial_update():
703713
class SubModel(BaseModel):
704714
v1: str = 'default'

0 commit comments

Comments
 (0)