@@ -334,7 +334,7 @@ def _add_dataclass_options(
334334 raise TypeError ("cls must be a dataclass" )
335335
336336 for field in fields (options_class ):
337- args = field .metadata .get ("args" , [f"--{ field . name . replace ( '_' , '-' )} " ])
337+ args = field .metadata .get ("args" , [f"--{ _get_arg_name ( field )} " ])
338338 positional = not args [0 ].startswith ("-" )
339339 kwargs = {
340340 "type" : field .metadata .get ("type" , field .type ),
@@ -448,7 +448,7 @@ def _handle_bool_type(field: Field, args: list, kwargs: dict):
448448 if field .default is True :
449449 kwargs ["action" ] = "store_false"
450450 if "args" not in field .metadata :
451- args [0 ] = f"--no-{ field . name . replace ( '_' , '-' )} "
451+ args [0 ] = f"--no-{ _get_arg_name ( field )} "
452452 kwargs ["dest" ] = field .name
453453 elif field .metadata .get ("required" ) is True :
454454 kwargs ["action" ] = BooleanOptionalAction
@@ -479,6 +479,12 @@ def _handle_argument_group(
479479 group .add_argument (* args , ** kwargs )
480480
481481
482+ def _get_arg_name (field : Field ):
483+ if field .metadata .get ("keep_underscores" , False ):
484+ return field .name
485+ return field .name .replace ("_" , "-" )
486+
487+
482488class ArgumentParser (argparse .ArgumentParser , Generic [OptionsType ]):
483489 """Command line argument parser that derives its options from a dataclass.
484490
0 commit comments