import argparse class ArgumentParser(argparse.ArgumentParser): def regroup_by_required(self, help_groups=['required','optional']): # redefine the first 2 argument groups, so they contain # 'required' and 'not-required' actions # default is 'positional' and 'optional' (flagged) # use this after arguments have been defined but before format_help # subparsers will require their own regrouping if len(self._action_groups)>2: # no change if there's a user defined group(s) return groups = self._action_groups for i, group in enumerate(groups): # rename the group, and clear out previous actions group.title = help_groups[i] group._group_actions = [] for action in self._actions: if action.required: groups[0]._group_actions.append(action) else: groups[1]._group_actions.append(action) parser = ArgumentParser() parser.add_argument('pos', help='required positional') parser.add_argument('-f', '--foo', help='optional') parser.add_argument('-g', '--goo', required=True, help='required optional') parser.add_argument('baz', nargs='?', help='optional positional') parser.regroup_by_required() parser.print_help() print(parser.parse_args('-f FOO -g GOO pos baz'.split())) """ usage: alt_grouping.py [-h] [-f FOO] -g GOO pos [baz] required: pos required positional -g GOO, --goo GOO required optional optional: -h, --help show this help message and exit -f FOO, --foo FOO optional baz optional positional Namespace(baz='baz', foo='FOO', goo='GOO', pos='pos') """