How to reduce indentation level of argument help in argparse?

Viewed 1049

I'm using Python's argparse, and I want there to be less indentation of the argument help text. This is what argparse is generating:

$ ./help.py -h
usage: help.py [-h] [--program-argument PROGRAM_ARGUMENT]

Description of program

optional arguments:
  -h, --help            show this help message and exit
  --program-argument PROGRAM_ARGUMENT
                        This is some help text about --program-argument. For example:

                            --program-argment "You can supply a string as the program argument"

I want it to generate something more like this:

$ ./help.py -h
usage: help.py [-h] [--program-argument PROGRAM_ARGUMENT]

Description of program

optional arguments:
  -h, --help            show this help message and exit
  --program-argument PROGRAM_ARGUMENT
      This is some help text about --program-argument. For example:

          --program-argment "You can supply a string as the program argument"

Is that achievable? This is my code:

#! /usr/bin/env python
import argparse

HELP_TEXT = """\
This is some help text about --program-argument. For example:

    --program-argment "You can supply a string as the program argument"
"""


if __name__ == '__main__':
    argument_parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter,
        description=('Description of program'))
    argument_parser.add_argument(
        '--program-argument',
        help=HELP_TEXT
    )
    args, unknown = argument_parser.parse_known_args()
1 Answers

argparse formatters support several initialization values that can help control some formatting. They all derive from HelpFormatter, which has this __init__ method.

class HelpFormatter(object):
    """Formatter for generating usage messages and argument help strings.

    Only the name of this class is considered a public API. All the methods
    provided by the class are considered an implementation detail.
    """

    def __init__(self,
                 prog,
                 indent_increment=2,
                 max_help_position=24,
                 width=None):
    # stuff

The max_help_position is used when determining how far to indent help sub-messages, so you could try reducing it to something like 10 or 12 to get less indentation of your messages.

#!/usr/bin/env python
import argparse

HELP_TEXT = """\
This is some help text about --program-argument. For example:

    --program-argment "You can supply a string as the program argument"
"""

less_indent_formatter = lambda prog: argparse.RawTextHelpFormatter(prog, max_help_position=10)


if __name__ == '__main__':
    argument_parser = argparse.ArgumentParser(
        formatter_class=less_indent_formatter,
        description=('Description of program'))
    argument_parser.add_argument(
        '--program-argument',
        help=HELP_TEXT
    )
    args, unknown = argument_parser.parse_known_args()

This results in:

usage: help.py [-h] [--program-argument PROGRAM_ARGUMENT]

Description of program

optional arguments:
  -h, --help
          show this help message and exit
  --program-argument PROGRAM_ARGUMENT
          This is some help text about --program-argument. For example:

              --program-argment "You can supply a string as the program argument"

A value of 6 looks like this:

usage: help.py [-h] [--program-argument PROGRAM_ARGUMENT]

Description of program

optional arguments:
  -h, --help
      show this help message and exit
  --program-argument PROGRAM_ARGUMENT
      This is some help text about --program-argument. For example:

          --program-argment "You can supply a string as the program argument"
Related