diff options
author | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2016-08-18 21:23:48 +0100 |
---|---|---|
committer | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2016-08-18 21:23:48 +0100 |
commit | ef948cd058180a2fb38d792c912c9b14d190d6c7 (patch) | |
tree | 58a73f353df03109da2d307e3ba4d972c1999a6e /Lib/argparse.py | |
parent | Anti-registration of various ABC methods. (diff) | |
download | cpython-ef948cd058180a2fb38d792c912c9b14d190d6c7.tar.gz cpython-ef948cd058180a2fb38d792c912c9b14d190d6c7.tar.bz2 cpython-ef948cd058180a2fb38d792c912c9b14d190d6c7.zip |
Closes #12713: Allowed abbreviation of subcommands in argparse.
Diffstat (limited to 'Lib/argparse.py')
-rw-r--r-- | Lib/argparse.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py index 209b4e99c1f..e0edad8e420 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1110,6 +1110,12 @@ class _SubParsersAction(Action): parser_name = values[0] arg_strings = values[1:] + # get full parser_name from (optional) abbreviated one + for p in self._name_parser_map: + if p.startswith(parser_name): + parser_name = p + break + # set the parser name if requested if self.dest is not SUPPRESS: setattr(namespace, self.dest, parser_name) @@ -2307,11 +2313,18 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def _check_value(self, action, value): # converted value must be one of the choices (if specified) - if action.choices is not None and value not in action.choices: - args = {'value': value, - 'choices': ', '.join(map(repr, action.choices))} - msg = _('invalid choice: %(value)r (choose from %(choices)s)') - raise ArgumentError(action, msg % args) + if action.choices is not None: + ac = [ax for ax in action.choices if str(ax).startswith(str(value))] + if len(ac) == 0: + args = {'value': value, + 'choices': ', '.join(map(repr, action.choices))} + msg = _('invalid choice: %(value)r (choose from %(choices)s)') + raise ArgumentError(action, msg % args) + elif len(ac) > 1: + args = {'value': value, + 'choices': ', '.join(ac)} + msg = _('ambiguous choice: %(value)r could match %(choices)s') + raise ArgumentError(action, msg % args) # ======================= # Help-formatting methods |