import argparse class ArgumentParser(argparse.ArgumentParser): """ArgumentParser with quick&dirty hack for #14365. .. note:: This fix preserves default argparse behaviour, which some might consider as a bug (misleading error information):: >>> parser = ArgumentParser() >>> subparsers = parser.add_subparsers() >>> parser_foo = subparsers.add_parser('foo') >>> parser_foo.add_argument('--bar') >>> parser.parse_args('--bar baz foo'.split()) usage: [-h] {foo} ... : error: invalid choice: 'baz' (choose from 'foo') Read more at http://bugs.python.org/issue14365. """ def _get_option_tuples(self, arg_string): option_tuples = super(ArgumentParser, self)._get_option_tuples(arg_string) if self._subparsers is None or len(option_tuples) <= 1: return option_tuples actions = self._subparsers._actions for action in actions: if isinstance(action, argparse._SubParsersAction): sub_action = action break subparsers = sub_action.choices.values() for subparser in subparsers: sub_option_tuples = subparser._get_option_tuples(arg_string) if len(sub_option_tuples) > 0: return [] return option_tuples