diff --git a/docs/index.md b/docs/index.md index fc48cf67..a89a0abc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -526,7 +526,7 @@ print(Settings().model_dump()) ``` To enable CLI parsing, we simply set the `cli_parse_args` flag to a valid value, which retains similar conotations as -defined in `argparse`. Alternatively, we can also directly provided the args to parse at time of instantiation: +defined in `argparse`. Alternatively, we can also directly provide the args to parse at time of instantiation: ```py from pydantic_settings import BaseSettings @@ -619,7 +619,7 @@ CLI argument parsing of dictionaries supports intermixing of any of the below tw These can be used in conjunction with list forms as well, e.g: - * `--field k1=1,k2=2 --field k3=3 --field '{"k4: 4}'` etc. + * `--field k1=1,k2=2 --field k3=3 --field '{"k4": 4}'` etc. ```py import sys @@ -671,7 +671,7 @@ print(Settings().model_dump()) #### Aliases -Pydantic field aliases are added as CLI argument aliases. +Pydantic field aliases are added as CLI argument aliases. Aliases of length one are converted into short options. ```py import sys @@ -683,15 +683,21 @@ from pydantic_settings import BaseSettings class User(BaseSettings, cli_parse_args=True): first_name: str = Field( - validation_alias=AliasChoices('fname', AliasPath('name', 0)) + validation_alias=AliasChoices('f', 'fname', AliasPath('name', 0)) + ) + last_name: str = Field( + validation_alias=AliasChoices('l', 'lname', AliasPath('name', 1)) ) - last_name: str = Field(validation_alias=AliasChoices('lname', AliasPath('name', 1))) sys.argv = ['example.py', '--fname', 'John', '--lname', 'Doe'] print(User().model_dump()) #> {'first_name': 'John', 'last_name': 'Doe'} +sys.argv = ['example.py', '-f', 'John', '-l', 'Doe'] +print(User().model_dump()) +#> {'first_name': 'John', 'last_name': 'Doe'} + sys.argv = ['example.py', '--name', 'John,Doe'] print(User().model_dump()) #> {'first_name': 'John', 'last_name': 'Doe'} diff --git a/pydantic_settings/sources.py b/pydantic_settings/sources.py index 95e9d2b8..ec9f604c 100644 --- a/pydantic_settings/sources.py +++ b/pydantic_settings/sources.py @@ -1428,10 +1428,10 @@ def _add_parser_args( if isinstance(group, dict): group = self._add_argument_group(parser, **group) added_args += list(arg_names) - self._add_argument(group, *(f'{arg_flag}{name}' for name in arg_names), **kwargs) + self._add_argument(group, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs) else: added_args += list(arg_names) - self._add_argument(parser, *(f'{arg_flag}{name}' for name in arg_names), **kwargs) + self._add_argument(parser, *(f'{arg_flag[:len(name)]}{name}' for name in arg_names), **kwargs) self._add_parser_alias_paths(parser, alias_path_args, added_args, arg_prefix, subcommand_prefix, group) return parser diff --git a/tests/test_settings.py b/tests/test_settings.py index 3222e50c..f0888e3b 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -2270,9 +2270,9 @@ class Cfg(BaseSettings, cli_avoid_json=avoid_json): cfg = Cfg( _cli_parse_args=[ - '--a', + '-a', 'a', - '--b', + '-b', 'b', '--str', 'str',