import argparse class MyParsersAction(argparse._SubParsersAction): def add_parser(self, name, **kwargs): # set prog from the existing prefix if kwargs.get('prog') is None: kwargs['prog'] = '%s %s' % (self._prog_prefix, name) aliases = kwargs.pop('aliases', ()) # create a pseudo-action to hold the choice help if 'help' in kwargs: help = kwargs.pop('help') if help != argparse.SUPPRESS: choice_action = self._ChoicesPseudoAction(name, aliases, help) self._choices_actions.append(choice_action) else: help = '' # build a metavar that excluses SUPPRESSed parsers # these names still appear in error messages if not hasattr(self, 'choices_list'): self.choices_list = [] if help != argparse.SUPPRESS: self.choices_list.append(name) for a in aliases: self.choices_list.append(a) self.metavar = '{%s}' % ','.join(self.choices_list) # create the parser and add it to the map parser = self._parser_class(**kwargs) self._name_parser_map[name] = parser # make parser available under aliases also for alias in aliases: self._name_parser_map[alias] = parser return parser if __name__ == '__main__': parser = argparse.ArgumentParser() parser.register('action', 'parsers', MyParsersAction) parser.add_argument('--foo', help='foo help') sub_parsers = parser.add_subparsers(dest='commands', title='subcommands') sub_parser = sub_parsers.add_parser('sub-command-1', aliases=('sub1',),help='sub-command-1 help') sub_parser = sub_parsers.add_parser('sub-command-2', aliases=('sub2',),help=argparse.SUPPRESS) sub_parser = sub_parsers.add_parser('sub-command-3', aliases=('sub3',)) parser.print_help() import sys if sys.argv[1:]: args = parser.parse_args() else: args = parser.parse_args('--foo test sub-command-1'.split()) print(args) """ 1946:~/mypy$ python3 issue22848.py usage: issue22848.py [-h] [--foo FOO] {sub-command-1,sub1,sub-command-3,sub3} ... optional arguments: -h, --help show this help message and exit --foo FOO foo help subcommands: {sub-command-1,sub1,sub-command-3,sub3} sub-command-1 (sub1) sub-command-1 help Namespace(commands='sub-command-1', foo='test') """