@@ -705,6 +705,34 @@ def _add_flag(
705705 )
706706
707707
708+ def _resolve_available_flags (
709+ parser : argparse .ArgumentParser ,
710+ primary_flag : str ,
711+ alias_flags : list [str ],
712+ reserved_flags : set [str ],
713+ ) -> list [str ]:
714+ option_string_actions = getattr (parser , "_option_string_actions" , {})
715+ if primary_flag in option_string_actions :
716+ raise ValueError (f"Conflicting primary option string: { primary_flag } " )
717+
718+ flags = [primary_flag ]
719+ seen = {primary_flag }
720+
721+ for alias in alias_flags :
722+ if alias in seen :
723+ continue
724+ seen .add (alias )
725+
726+ if alias in reserved_flags :
727+ continue
728+ if alias in option_string_actions :
729+ continue
730+
731+ flags .append (alias )
732+
733+ return flags
734+
735+
708736def add_args_from_callable_signature (
709737 parser : argparse .ArgumentParser ,
710738 fn : Callable [..., Any ],
@@ -722,6 +750,7 @@ def add_args_from_callable_signature(
722750 sig = inspect .signature (fn )
723751 help = _parse_args_section_from_doc (inspect .getdoc (fn ) or "" )
724752 hints = typing .get_type_hints (fn , include_extras = True )
753+ arg_specs : list [tuple [str , list [str ], Any , str | None ]] = []
725754
726755 for name in sig .parameters .keys ():
727756 resolved_type = unwrap_union (hints .get (name ))
@@ -738,17 +767,21 @@ def add_args_from_callable_signature(
738767 prefix = name .replace ("_" , "-" )
739768 field_kebab = field_name .replace ("_" , "-" )
740769 flag_name = f"--{ prefix } -{ field_kebab } "
741- flags = [ flag_name ] + aliases .get (f"{ name } .{ field_name } " , []) + [f"--{ field_kebab } " ]
770+ alias_flags = aliases .get (f"{ name } .{ field_name } " , []) + [f"--{ field_kebab } " ]
742771 help_text = help_overrides .get (f"{ name } .{ field_name } " , field_help .get (field_name ))
743772
744- _add_flag ( parser , flags , field_hints .get (field_name , field_type ), help_text )
773+ arg_specs . append (( flag_name , alias_flags , field_hints .get (field_name , field_type ), help_text ) )
745774 continue
746775
747776 if name in top_level_skip :
748777 continue
749778
750779 flag_name = "--" + name .replace ("_" , "-" )
751- flags = [flag_name ] + aliases .get (name , [])
752780 help_text = help_overrides .get (name , help .get (name ))
781+ arg_specs .append ((flag_name , aliases .get (name , []), hints .get (name ), help_text ))
782+
783+ reserved_flags = {primary_flag for primary_flag , _ , _ , _ in arg_specs }
753784
754- _add_flag (parser , flags , hints .get (name ), help_text )
785+ for primary_flag , alias_flags , hint , help_text in arg_specs :
786+ flags = _resolve_available_flags (parser , primary_flag , alias_flags , reserved_flags )
787+ _add_flag (parser , flags , hint , help_text )
0 commit comments