Skip to content

Commit 0c87345

Browse files
hramezaniclaude
andauthored
Fix field named cls conflicting with classmethod parameter (#858)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7bd0072 commit 0c87345

2 files changed

Lines changed: 26 additions & 9 deletions

File tree

pydantic_settings/main.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ def __init__(
240240
_cli_kebab_case=_cli_kebab_case,
241241
_cli_shortcuts=_cli_shortcuts,
242242
_secrets_dir=_secrets_dir,
243-
**values,
243+
_init_kwargs=values,
244244
)
245245
)
246246

@@ -300,7 +300,7 @@ def _settings_init_sources(
300300
_cli_kebab_case: bool | Literal['all', 'no_enums'] | None = None,
301301
_cli_shortcuts: Mapping[str, str | list[str]] | None = None,
302302
_secrets_dir: PathType | None = None,
303-
**init_kwargs: dict[str, Any],
303+
_init_kwargs: dict[str, Any] | None = None,
304304
) -> tuple[tuple[PydanticBaseSettingsSource, ...], dict[str, Any]]:
305305
# Determine settings config values
306306
case_sensitive = _case_sensitive if _case_sensitive is not None else cls.model_config.get('case_sensitive')
@@ -378,7 +378,7 @@ def _settings_init_sources(
378378
)
379379
init_settings = InitSettingsSource(
380380
cls,
381-
init_kwargs=init_kwargs,
381+
init_kwargs=_init_kwargs if _init_kwargs is not None else {},
382382
nested_model_default_partial_update=nested_model_default_partial_update,
383383
)
384384
env_settings = EnvSettingsSource(
@@ -451,7 +451,7 @@ def _settings_init_sources(
451451

452452
cls._settings_warn_unused_config_keys(sources, cls.model_config)
453453

454-
return sources, init_kwargs
454+
return sources, _init_kwargs if _init_kwargs is not None else {}
455455

456456
@classmethod
457457
def _settings_build_values(
@@ -723,19 +723,26 @@ def run(
723723
elif isinstance(cli_parse_args, (Namespace, SimpleNamespace, dict)):
724724
raise SettingsError('Error: `cli_args` must be list[str] or None when `cli_settings_source` is not used')
725725

726-
model_init_data['_cli_parse_args'] = cli_parse_args
727-
model_init_data['_cli_exit_on_error'] = cli_exit_on_error
728-
model_init_data['_cli_settings_source'] = cli_settings
729726
if not issubclass(model_cls, BaseSettings):
730727
base_settings_cls = CliApp._get_base_settings_cls(model_cls)
731-
sources, init_kwargs = base_settings_cls._settings_init_sources(**model_init_data)
728+
sources, init_kwargs = base_settings_cls._settings_init_sources(
729+
_cli_parse_args=cli_parse_args, # type: ignore[arg-type]
730+
_cli_exit_on_error=cli_exit_on_error,
731+
_cli_settings_source=cli_settings,
732+
_init_kwargs=model_init_data,
733+
)
732734
model = base_settings_cls(**base_settings_cls._settings_build_values(sources, init_kwargs))
733735
model_init_data = {}
734736
for field_name, field_info in base_settings_cls.model_fields.items():
735737
model_init_data[_field_name_for_signature(field_name, field_info)] = getattr(model, field_name)
736738
command = model_cls(**model_init_data)
737739
else:
738-
sources, init_kwargs = model_cls._settings_init_sources(**model_init_data)
740+
sources, init_kwargs = model_cls._settings_init_sources(
741+
_cli_parse_args=cli_parse_args, # type: ignore[arg-type]
742+
_cli_exit_on_error=cli_exit_on_error,
743+
_cli_settings_source=cli_settings,
744+
_init_kwargs=model_init_data,
745+
)
739746
command = model_cls(_build_sources=(sources, init_kwargs))
740747

741748
subcommand_dest = ':subcommand'

tests/test_settings.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3689,3 +3689,13 @@ class Cfg(BaseSettings):
36893689
env.set('VAL', env_val)
36903690
cfg = Cfg()
36913691
assert cfg.val is expected
3692+
3693+
3694+
def test_field_named_cls():
3695+
"""Test that a model with a field named `cls` works correctly (GH-857)."""
3696+
3697+
class Settings(BaseSettings):
3698+
cls: str = 'Foo'
3699+
3700+
s = Settings.model_validate({'cls': 'Foo'})
3701+
assert s.cls == 'Foo'

0 commit comments

Comments
 (0)