Python argparse

From wikinotes

Argparse is a builting python library for building commandline interfaces.
The help menu is generated automatically.

Documentation

official docs https://docs.python.org/3/library/argparse.html

Example

import argparse

parser = argparse.ArgumentParser(description='Does thing real well')
parser.add_argument('-v', '--verbose',
                    action='store_true', help='enable verbose logging')

args = parser.parse_args()
print(args.verbose)  # True

Arguments

Argument Types

# number of args
(nothing)  # positional
nargs=1    # flag with N args
nargs='+'  # flag with one or more args    (args.arg  = [])
nargs='?'  # flag with one or no args      (args.arg  = None, 'var')  
           #(set const=val to know when flag issued with no arguments)
nargs='*'  # flag with multiple or no args (args.arg  = None, [], ['a','b',...])

# boolean args
action='store_true'
action='store_false'

Samples:

# foo my/output/file
parser.add_argument('output-file',
                    help='filepath to save spreadsheet to')

# foo -s today
parser.add_argument('-s', '--start-date',
                    nargs=1, help='date to start from')

# foo -v
parser.add_argument('-v', '--verbose',
                    action='store_true', help='verbose logging')

Parsers

Helpstring Formatting

You can preserve whitespace/newlines with custom formatters.

import argparse
import textwrap

parser = argparse.ArgumentParser(
    prog="my-program",
    formatter_class=argparse.RawDescriptionHelpFormatter,
    description=textwrap.dedent("""
        program that does thing
        =======================

            * do thing
            * other thing
    """).strip())

SubParsers

Subparsers let you bind a different parser to sub-commands.
(ex. git checkout ${params} vs git fetch ${params})

# create parser
git_parser = argparse.ArgumentParser()
# create subparsers
subparsers = git_parser.add_subparsers(dest="git_subparser")
git_checkout_parser = subparsers.add_parser("checkout")
git_fetch_parser = subparser.add_parser("fetch")
git_fetch_parser = subparser.add_parser("show")
# add arguments to subparsers
git_checkout_parser.add_argument("file_or_commit", help="file/commit to checkout")
# identifying subparser, and parsing args
args = git_parser.parse_args()
if args.git_subparser == "checkout":
    # ...
elif args.git_subparser == "fetch":
    # ...
elif args.git_subparser == "show":
    # ...