Skip to content

pydantic-settings fails to handle unions with defaults; raises Attribute error #471

@klieret

Description

@klieret

Thank you for this wonderful addition to pydantic.

However, the following snippet

from pydantic_settings import BaseSettings, CliApp


class Cat(BaseSettings):
    meow: str = "meow"
    
class Dog(BaseSettings):
    bark: str = "bark"
    

class Car(BaseSettings):
    driver: Cat | Dog = Cat()


CliApp.run(Car)

raises

Traceback (most recent call last):
  File "/Users/fuchur/Documents/24/git_sync/config-comparison/union_type_issues.py", line 14, in <module>
    CliApp.run(Car)
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/main.py", line 516, in run
    return CliApp._run_cli_cmd(model_cls(**model_init_data), cli_cmd_method_name, is_required=False)
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/main.py", line 168, in __init__
    **__pydantic_self__._settings_build_values(
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/main.py", line 362, in _settings_build_values
    cli_settings = CliSettingsSource[Any](
                   ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/miniconda3/envs/confexp/lib/python3.11/typing.py", line 1289, in __call__
    result = self.__origin__(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/sources.py", line 1163, in __init__
    self._connect_root_parser(
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/sources.py", line 1572, in _connect_root_parser
    self._add_parser_args(
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/sources.py", line 1685, in _add_parser_args
    self._add_parser_submodels(
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/sources.py", line 1787, in _add_parser_submodels
    self._add_parser_args(
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/sources.py", line 1653, in _add_parser_args
    kwargs['help'] = self._help_format(field_name, field_info, model_default)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic_settings/sources.py", line 1898, in _help_format
    default = f'(default: {getattr(model_default, field_name)})'
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/miniconda3/envs/confexp/lib/python3.11/site-packages/pydantic/main.py", line 856, in __getattr__
    raise AttributeError(f'{type(self).__name__!r} object has no attribute {item!r}')
AttributeError: 'Cat' object has no attribute 'bark'

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions