From b6ea9d9826c3d8d99fdf63444bdf8a1e2ea7e8f7 Mon Sep 17 00:00:00 2001 From: Kyle Schwab Date: Fri, 21 Feb 2025 08:44:42 -0700 Subject: [PATCH 1/4] Fix for init source kwarg alias resolution. --- pydantic_settings/sources.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pydantic_settings/sources.py b/pydantic_settings/sources.py index bd4f4315..3338013d 100644 --- a/pydantic_settings/sources.py +++ b/pydantic_settings/sources.py @@ -388,7 +388,15 @@ def __init__( init_kwargs: dict[str, Any], nested_model_default_partial_update: bool | None = None, ): - self.init_kwargs = init_kwargs + self.init_kwargs = {} + init_kwargs_names = set(init_kwargs.keys()) + for field_name, field_info in settings_cls.model_fields.items(): + alias_names, *_ = _get_alias_names(field_name, field_info) + init_kwarg_name = init_kwargs_names & set(alias_names) + if init_kwarg_name: + preferred_alias = alias_names[0] + self.init_kwargs[preferred_alias] = init_kwargs[init_kwarg_name.pop()] + super().__init__(settings_cls) self.nested_model_default_partial_update = ( nested_model_default_partial_update From 20377d5d4606a96f8b25a38296025697f768d1cf Mon Sep 17 00:00:00 2001 From: Kyle Schwab Date: Fri, 21 Feb 2025 09:20:21 -0700 Subject: [PATCH 2/4] Add init kwargs extra attribs. --- pydantic_settings/sources.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pydantic_settings/sources.py b/pydantic_settings/sources.py index 3338013d..cfbbac08 100644 --- a/pydantic_settings/sources.py +++ b/pydantic_settings/sources.py @@ -389,13 +389,15 @@ def __init__( nested_model_default_partial_update: bool | None = None, ): self.init_kwargs = {} - init_kwargs_names = set(init_kwargs.keys()) + init_kwarg_names = set(init_kwargs.keys()) for field_name, field_info in settings_cls.model_fields.items(): alias_names, *_ = _get_alias_names(field_name, field_info) - init_kwarg_name = init_kwargs_names & set(alias_names) + init_kwarg_name = init_kwarg_names & set(alias_names) if init_kwarg_name: preferred_alias = alias_names[0] + init_kwarg_names -= init_kwarg_name self.init_kwargs[preferred_alias] = init_kwargs[init_kwarg_name.pop()] + self.init_kwargs.update({key: val for key, val in init_kwargs.items() if key in init_kwarg_names}) super().__init__(settings_cls) self.nested_model_default_partial_update = ( From f7585ec12bfa30327dd1c8fda7511efc34bba184 Mon Sep 17 00:00:00 2001 From: Kyle Schwab Date: Sat, 22 Feb 2025 07:30:46 -0700 Subject: [PATCH 3/4] Add test. --- tests/test_settings.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/test_settings.py b/tests/test_settings.py index ba793a8e..7b6e66e0 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -662,6 +662,20 @@ def settings_customise_sources( assert s.model_dump() == s_final +def test_alias_resolution_init_source(env): + class Example(BaseSettings): + model_config = SettingsConfigDict(env_prefix='PREFIX') + + name: str + last_name: str = Field(validation_alias=AliasChoices('PREFIX_LAST_NAME', 'PREFIX_SURNAME')) + + env.set('PREFIX_SURNAME', 'smith') + assert Example(name='john', PREFIX_SURNAME='doe').model_dump() == { + 'name': 'john', + 'last_name': 'doe' + } + + def test_alias_nested_model_default_partial_update(): class SubModel(BaseModel): v1: str = 'default' From 5bb46cf3bb27f837b151b73c00159fb0e61810bb Mon Sep 17 00:00:00 2001 From: Kyle Schwab Date: Sat, 22 Feb 2025 07:33:44 -0700 Subject: [PATCH 4/4] Lint. --- tests/test_settings.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/test_settings.py b/tests/test_settings.py index 7b6e66e0..1483dd7d 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -670,10 +670,7 @@ class Example(BaseSettings): last_name: str = Field(validation_alias=AliasChoices('PREFIX_LAST_NAME', 'PREFIX_SURNAME')) env.set('PREFIX_SURNAME', 'smith') - assert Example(name='john', PREFIX_SURNAME='doe').model_dump() == { - 'name': 'john', - 'last_name': 'doe' - } + assert Example(name='john', PREFIX_SURNAME='doe').model_dump() == {'name': 'john', 'last_name': 'doe'} def test_alias_nested_model_default_partial_update():