@@ -1026,6 +1026,7 @@ class CliSettingsSource(EnvSettingsSource, Generic[T]):
1026
1026
cli_exit_on_error: Determines whether or not the internal parser exits with error info when an error occurs.
1027
1027
Defaults to `True`.
1028
1028
cli_prefix: Prefix for command line arguments added under the root parser. Defaults to "".
1029
+ cli_flag_prefix_char: The flag prefix character to use for CLI optional arguments. Defaults to '-'.
1029
1030
cli_implicit_flags: Whether `bool` fields should be implicitly converted into CLI boolean flags.
1030
1031
(e.g. --flag, --no-flag). Defaults to `False`.
1031
1032
cli_ignore_unknown_args: Whether to ignore unknown CLI args and parse only known ones. Defaults to `False`.
@@ -1056,6 +1057,7 @@ def __init__(
1056
1057
cli_use_class_docs_for_groups : bool | None = None ,
1057
1058
cli_exit_on_error : bool | None = None ,
1058
1059
cli_prefix : str | None = None ,
1060
+ cli_flag_prefix_char : str | None = None ,
1059
1061
cli_implicit_flags : bool | None = None ,
1060
1062
cli_ignore_unknown_args : bool | None = None ,
1061
1063
case_sensitive : bool | None = True ,
@@ -1097,6 +1099,12 @@ def __init__(
1097
1099
else settings_cls .model_config .get ('cli_exit_on_error' , True )
1098
1100
)
1099
1101
self .cli_prefix = cli_prefix if cli_prefix is not None else settings_cls .model_config .get ('cli_prefix' , '' )
1102
+ self .cli_flag_prefix_char = (
1103
+ cli_flag_prefix_char
1104
+ if cli_flag_prefix_char is not None
1105
+ else settings_cls .model_config .get ('cli_flag_prefix_char' , '-' )
1106
+ )
1107
+ self ._cli_flag_prefix = self .cli_flag_prefix_char * 2
1100
1108
if self .cli_prefix :
1101
1109
if cli_prefix .startswith ('.' ) or cli_prefix .endswith ('.' ) or not cli_prefix .replace ('.' , '' ).isidentifier (): # type: ignore
1102
1110
raise SettingsError (f'CLI settings source prefix is invalid: { cli_prefix } ' )
@@ -1131,6 +1139,7 @@ def __init__(
1131
1139
prog = self .cli_prog_name ,
1132
1140
description = None if settings_cls .__doc__ is None else dedent (settings_cls .__doc__ ),
1133
1141
formatter_class = formatter_class ,
1142
+ prefix_chars = self .cli_flag_prefix_char ,
1134
1143
)
1135
1144
if root_parser is None
1136
1145
else root_parser
@@ -1503,7 +1512,8 @@ def parse_args_insensitive_method(
1503
1512
) -> Any :
1504
1513
insensitive_args = []
1505
1514
for arg in shlex .split (shlex .join (args )) if args else []:
1506
- matched = re .match (r'^(--[^\s=]+)(.*)' , arg )
1515
+ flag_prefix = rf'\{ self .cli_flag_prefix_char } {{1,2}}'
1516
+ matched = re .match (rf'^({ flag_prefix } [^\s=]+)(.*)' , arg )
1507
1517
if matched :
1508
1518
arg = matched .group (1 ).lower () + matched .group (2 )
1509
1519
insensitive_args .append (arg )
@@ -1621,7 +1631,7 @@ def _add_parser_args(
1621
1631
model_default = PydanticUndefined ,
1622
1632
)
1623
1633
else :
1624
- arg_flag : str = '--'
1634
+ flag_prefix : str = self . _cli_flag_prefix
1625
1635
is_append_action = _annotation_contains_types (
1626
1636
field_info .annotation , (list , set , dict , Sequence , Mapping ), is_strip_annotated = True
1627
1637
)
@@ -1655,7 +1665,7 @@ def _add_parser_args(
1655
1665
arg_names = [kwargs ['dest' ]]
1656
1666
del kwargs ['dest' ]
1657
1667
del kwargs ['required' ]
1658
- arg_flag = ''
1668
+ flag_prefix = ''
1659
1669
1660
1670
self ._convert_bool_flag (kwargs , field_info , model_default )
1661
1671
@@ -1666,7 +1676,7 @@ def _add_parser_args(
1666
1676
added_args ,
1667
1677
arg_prefix ,
1668
1678
subcommand_prefix ,
1669
- arg_flag ,
1679
+ flag_prefix ,
1670
1680
arg_names ,
1671
1681
kwargs ,
1672
1682
field_name ,
@@ -1679,10 +1689,12 @@ def _add_parser_args(
1679
1689
if isinstance (group , dict ):
1680
1690
group = self ._add_argument_group (parser , ** group )
1681
1691
added_args += list (arg_names )
1682
- self ._add_argument (group , * (f'{ arg_flag [:len (name )]} { name } ' for name in arg_names ), ** kwargs )
1692
+ self ._add_argument (group , * (f'{ flag_prefix [:len (name )]} { name } ' for name in arg_names ), ** kwargs )
1683
1693
else :
1684
1694
added_args += list (arg_names )
1685
- self ._add_argument (parser , * (f'{ arg_flag [:len (name )]} { name } ' for name in arg_names ), ** kwargs )
1695
+ self ._add_argument (
1696
+ parser , * (f'{ flag_prefix [:len (name )]} { name } ' for name in arg_names ), ** kwargs
1697
+ )
1686
1698
1687
1699
self ._add_parser_alias_paths (parser , alias_path_args , added_args , arg_prefix , subcommand_prefix , group )
1688
1700
return parser
@@ -1723,7 +1735,7 @@ def _add_parser_submodels(
1723
1735
added_args : list [str ],
1724
1736
arg_prefix : str ,
1725
1737
subcommand_prefix : str ,
1726
- arg_flag : str ,
1738
+ flag_prefix : str ,
1727
1739
arg_names : list [str ],
1728
1740
kwargs : dict [str , Any ],
1729
1741
field_name : str ,
@@ -1758,7 +1770,7 @@ def _add_parser_submodels(
1758
1770
added_args .append (arg_names [0 ])
1759
1771
kwargs ['help' ] = f'set { arg_names [0 ]} from JSON string'
1760
1772
model_group = self ._add_argument_group (parser , ** model_group_kwargs )
1761
- self ._add_argument (model_group , * (f'{ arg_flag } { name } ' for name in arg_names ), ** kwargs )
1773
+ self ._add_argument (model_group , * (f'{ flag_prefix } { name } ' for name in arg_names ), ** kwargs )
1762
1774
for model in sub_models :
1763
1775
self ._add_parser_args (
1764
1776
parser = parser ,
@@ -1804,7 +1816,7 @@ def _add_parser_alias_paths(
1804
1816
kwargs ['metavar' ] = 'list'
1805
1817
if arg_name not in added_args :
1806
1818
added_args .append (arg_name )
1807
- self ._add_argument (context , f'-- { arg_name } ' , ** kwargs )
1819
+ self ._add_argument (context , f'{ self . _cli_flag_prefix } { arg_name } ' , ** kwargs )
1808
1820
1809
1821
def _get_modified_args (self , obj : Any ) -> tuple [str , ...]:
1810
1822
if not self .cli_hide_none_type :
0 commit comments