Skip to content

list[str] does not accept integer arguments. #738

@kzrnm

Description

@kzrnm

Consider the following arguments. When I pass 1 to a str argument, it is correctly read as '1', but when you pass it to list[str], it results in “Input should be a valid string.”

class RootCommand(
    BaseSettings,
    cli_parse_args=True,
    cli_implicit_flags='toggle',
):
    a: CliPositionalArg[str]
    rem: CliPositionalArg[list[str]] = Field(default_factory=list)
    text: str
    param: list[str] = Field(default_factory=list)

    def cli_cmd(self):
        print('------pydantic-settings-------')
        print(self)
        print('------pydantic-settings help-------')
        CliSettingsSource[argparse.ArgumentParser](RootCommand).root_parser.print_help()


def main(args: list[str] | None = None):
    CliApp.run(RootCommand, cli_args=args)


def mainA():
    print('------------argparse-------------')
    parser = argparse.ArgumentParser()
    parser.add_argument('a', type=str)
    parser.add_argument('rem', type=str, nargs='*')
    parser.add_argument('--text', type=str)
    parser.add_argument('--param', type=str, nargs='*')
    print(parser.parse_args())
    print('------------argparse help-------------')
    parser.print_help()


if __name__ == '__main__':
    mainA()
    print('----------------------------------')
    main()
$ python app.py 1 b c --text 2 --param e
------------argparse-------------
Namespace(a='1', rem=['b', 'c'], text='2', param=['e'])
------------argparse help-------------
usage: app.py [-h] [--text TEXT] [--param [PARAM ...]] a [rem ...]

positional arguments:
  a
  rem

options:
  -h, --help           show this help message and exit
  --text TEXT
  --param [PARAM ...]
----------------------------------
------pydantic-settings-------
a='1' rem=['b', 'c'] text='2' param=['e']
------pydantic-settings help-------
usage: app.py [-h] [--text str] [--param list[str]] A [REM ...]

positional arguments:
  A
  REM                (default factory: list)

options:
  -h, --help         show this help message and exit
  --text str         (required)
  --param list[str]  (default factory: list)
$ python app.py 1 0 c --text 2 --param 3
------------argparse-------------
Namespace(a='1', rem=['0', 'c'], text='2', param=['3'])
------------argparse help-------------
usage: app.py [-h] [--text TEXT] [--param [PARAM ...]] a [rem ...]

positional arguments:
  a
  rem

options:
  -h, --help           show this help message and exit
  --text TEXT
  --param [PARAM ...]
----------------------------------
Traceback (most recent call last):
  File "/home/kzrnm/workspace/forks/pydantic-settings/app.py", line 60, in <module>
    main()
  File "/home/kzrnm/workspace/forks/pydantic-settings/app.py", line 42, in main
    CliApp.run(RootCommand, cli_args=args)
  File "/home/kzrnm/workspace/forks/pydantic-settings/pydantic_settings/main.py", line 683, in run
    return CliApp._run_cli_cmd(model_cls(**model_init_data), cli_cmd_method_name, is_required=False)
  File "/home/kzrnm/workspace/forks/pydantic-settings/pydantic_settings/main.py", line 198, in __init__
    super().__init__(
  File "/home/kzrnm/workspace/forks/pydantic-settings/.venv/lib/python3.10/site-packages/pydantic/main.py", line 250, in __init__
    validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self)
pydantic_core._pydantic_core.ValidationError: 2 validation errors for RootCommand
rem.0
  Input should be a valid string [type=string_type, input_value=0, input_type=int]
    For further information visit https://errors.pydantic.dev/2.12/v/string_type
param.0
  Input should be a valid string [type=string_type, input_value=3, input_type=int]
    For further information visit https://errors.pydantic.dev/2.12/v/string_type

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions