9

I want to construct a argparser help message that looks like:

-i, --input=INPUT    help for input
-o, --output=output  help for output

My current code:

arg_parser = argparse.ArgumentParser
arg_parser.add_argument('-i', '--input', dest='input', metavar='=INPUT', help='help for input')
arg_parser.add_argument('-o', '--output', dest='output', metavar='=OUTPUT', help='help for output')
arg_parser.print_help()

is giving me

-i =INPUT, --input =INPUT    help for input
-o =INPUT, --output =output  help for output

I just want to know how to get rid of the things in between short and long options.

Yarek T
  • 9,435
  • 2
  • 27
  • 37
user1948847
  • 905
  • 1
  • 11
  • 26
  • 2
    There is no way to do this using the default help formatters; you'd have to write a customer help formatter to accomplish this. – chepner May 29 '14 at 15:13

2 Answers2

8

Don't show long options twice in print_help() from argparse

asks essentially the same thing. If you are not up to writing your own HelpFormatter subclass (it probably needs to change one method), you need to play with the existing formatting tools - help, metavar, and description.

Here also argparse help without duplicate ALLCAPS

and How do I avoid the capital placeholders in python's argparse module?

For that 88275023 question I worked out (but didn't post) this Formatter class. The change is near the end

class CustomFormatter(argparse.HelpFormatter):
    def _format_action_invocation(self, action):
        if not action.option_strings:
            metavar, = self._metavar_formatter(action, action.dest)(1)
            return metavar
        else:
            parts = []
            # if the Optional doesn't take a value, format is:
            #    -s, --long
            if action.nargs == 0:
                parts.extend(action.option_strings)

            # if the Optional takes a value, format is:
            #    -s ARGS, --long ARGS
            # change to 
            #    -s, --long ARGS
            else:
                default = action.dest.upper()
                args_string = self._format_args(action, default)
                for option_string in action.option_strings:
                    #parts.append('%s %s' % (option_string, args_string))
                    parts.append('%s' % option_string)
                parts[-1] += ' %s'%args_string
            return ', '.join(parts)
Community
  • 1
  • 1
hpaulj
  • 201,845
  • 13
  • 203
  • 313
5

As mentioned in a comment of the accepted answer, following parameter was enough for me.

metavar='\b'
kmchmk
  • 510
  • 9
  • 15
  • I recommend using this if the argument option in question is going to be `required=True` - if you use `metavar=''`, you'll get an `AssertionError`. – skwidbreth Sep 11 '20 at 14:11