Subparsers

The statement parser.add_commands([bar, quux]) builds two subparsers named bar and quux. A “subparser” is an argument parser bound to a group name. In other words, it works with everything after a certain positional argument. Argh implements commands by creating a subparser for every function.

Again, here’s how we create two subparsers for commands foo and bar:

parser = ArghParser()
parser.add_commands([bar, quux])
parser.dispatch()

The equivalent code without Argh would be:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

foo_parser = subparsers.add_parser("foo")
foo_parser.set_defaults(function=foo)

bar_parser = subparsers.add_parser("bar")
bar_parser.set_defaults(function=bar)

args = parser.parse_args()
print(args.function(args))

Now consider this expression:

parser = ArghParser()
parser.add_commands([bar, quux], group_name="foo")
parser.dispatch()

It produces a command hierarchy for the command-line expressions foo bar and foo quux. This involves “subsubparsers”. Without Argh you would need to write something like this (generic argparse API):

import sys
import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

foo_parser = subparsers.add_parser("foo")
foo_subparsers = foo_parser.add_subparsers()

foo_bar_parser = foo_subparsers.add_parser("bar")
foo_bar_parser.set_defaults(function=bar)

foo_quux_parser = foo_subparsers.add_parser("quux")
foo_quux_parser.set_defaults(function=quux)

args = parser.parse_args()
print(args.function(args))

Note

You don’t have to use ArghParser; the standard argparse.ArgumentParser will do. You will just need to call stand-alone functions argh.assembling.add_commands() and argh.dispatching.dispatch() instead of argh.helpers.ArghParser methods.