Skip to content

Instantly share code, notes, and snippets.

Created June 26, 2017 18:36
Show Gist options
  • Save anonymous/f4be805fc3ff9e132eb1e1aa0b4f7d4b to your computer and use it in GitHub Desktop.
Save anonymous/f4be805fc3ff9e132eb1e1aa0b4f7d4b to your computer and use it in GitHub Desktop.
Revised multi-layered Argparse
import sys
import argparse
# noinspection PyShadowingNames
def parse_args(parser, commands):
# Divide argv by commands
split_argv = []
for c in sys.argv[1:]:
# noinspection PyProtectedMember
if c in commands.choices or c in parser._option_string_actions.keys():
if c == '-h' and len(split_argv) >= 1:
split_argv[-1].append(c)
else:
split_argv.append([c])
else:
raise Exception('Argument "{0}" unknown.'.format(c))
# Initialize namespace
args = argparse.Namespace()
for c in commands.choices:
setattr(args, c, None)
# Parse each command
if len(split_argv) == 0:
split_argv.append(['-h']) # if no command was given
parser.parse_args(split_argv[0], namespace=args) # Without command
for argv in split_argv[1:]: # Commands
n = argparse.Namespace()
setattr(args, argv[0], n)
parser.parse_args(argv, namespace=n)
return args
parser = argparse.ArgumentParser()
commands = parser.add_subparsers(title='sub-commands')
cmd1_parser = commands.add_parser('cmd1')
cmd1_parser.add_argument('--foo')
cmd2_parser = commands.add_parser('cmd2')
cmd2_parser.add_argument('--foo')
cmd2_parser = commands.add_parser('cmd3')
cmd2_parser.add_argument('--foo')
args = parse_args(parser, commands)
print(args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment