|
35 | 35 | YamlConfigSettingsSource, |
36 | 36 | get_subcommand, |
37 | 37 | ) |
| 38 | +from .sources.utils import _get_alias_names |
38 | 39 |
|
39 | 40 | T = TypeVar('T') |
40 | 41 |
|
@@ -444,13 +445,35 @@ def _settings_build_values( |
444 | 445 |
|
445 | 446 | # Strip any default values not explicity set before returning final state |
446 | 447 | state = {key: val for key, val in state.items() if key not in defaults or defaults[key] != val} |
| 448 | + self._settings_restore_init_kwarg_names(self.__class__, init_kwargs, state) |
447 | 449 |
|
448 | 450 | return state |
449 | 451 | else: |
450 | 452 | # no one should mean to do this, but I think returning an empty dict is marginally preferable |
451 | 453 | # to an informative error and much better than a confusing error |
452 | 454 | return {} |
453 | 455 |
|
| 456 | + @staticmethod |
| 457 | + def _settings_restore_init_kwarg_names( |
| 458 | + settings_cls: type[BaseSettings], init_kwargs: dict[str, Any], state: dict[str, Any] |
| 459 | + ) -> None: |
| 460 | + """ |
| 461 | + Restore the init_kwarg key names to the final merged state dictionary. |
| 462 | + """ |
| 463 | + if init_kwargs and state: |
| 464 | + state_kwarg_names = set(state.keys()) |
| 465 | + init_kwarg_names = set(init_kwargs.keys()) |
| 466 | + for field_name, field_info in settings_cls.model_fields.items(): |
| 467 | + alias_names, *_ = _get_alias_names(field_name, field_info) |
| 468 | + matchable_names = set(alias_names) |
| 469 | + include_name = settings_cls.model_config.get('populate_by_name', False) |
| 470 | + if include_name: |
| 471 | + matchable_names.add(field_name) |
| 472 | + init_kwarg_name = init_kwarg_names & matchable_names |
| 473 | + state_kwarg_name = state_kwarg_names & matchable_names |
| 474 | + if init_kwarg_name and state_kwarg_name: |
| 475 | + state[init_kwarg_name.pop()] = state.pop(state_kwarg_name.pop()) |
| 476 | + |
454 | 477 | @staticmethod |
455 | 478 | def _settings_warn_unused_config_keys(sources: tuple[object, ...], model_config: SettingsConfigDict) -> None: |
456 | 479 | """ |
|
0 commit comments