Skip to content

Commit 1a4f3f4

Browse files
authored
Fix for init source kwarg alias resolution. (#550)
1 parent f76c7fe commit 1a4f3f4

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

pydantic_settings/sources.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,17 @@ def __init__(
388388
init_kwargs: dict[str, Any],
389389
nested_model_default_partial_update: bool | None = None,
390390
):
391-
self.init_kwargs = init_kwargs
391+
self.init_kwargs = {}
392+
init_kwarg_names = set(init_kwargs.keys())
393+
for field_name, field_info in settings_cls.model_fields.items():
394+
alias_names, *_ = _get_alias_names(field_name, field_info)
395+
init_kwarg_name = init_kwarg_names & set(alias_names)
396+
if init_kwarg_name:
397+
preferred_alias = alias_names[0]
398+
init_kwarg_names -= init_kwarg_name
399+
self.init_kwargs[preferred_alias] = init_kwargs[init_kwarg_name.pop()]
400+
self.init_kwargs.update({key: val for key, val in init_kwargs.items() if key in init_kwarg_names})
401+
392402
super().__init__(settings_cls)
393403
self.nested_model_default_partial_update = (
394404
nested_model_default_partial_update

tests/test_settings.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,17 @@ def settings_customise_sources(
662662
assert s.model_dump() == s_final
663663

664664

665+
def test_alias_resolution_init_source(env):
666+
class Example(BaseSettings):
667+
model_config = SettingsConfigDict(env_prefix='PREFIX')
668+
669+
name: str
670+
last_name: str = Field(validation_alias=AliasChoices('PREFIX_LAST_NAME', 'PREFIX_SURNAME'))
671+
672+
env.set('PREFIX_SURNAME', 'smith')
673+
assert Example(name='john', PREFIX_SURNAME='doe').model_dump() == {'name': 'john', 'last_name': 'doe'}
674+
675+
665676
def test_alias_nested_model_default_partial_update():
666677
class SubModel(BaseModel):
667678
v1: str = 'default'

0 commit comments

Comments
 (0)