summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Hatfield-Dodds <Zac-HD@users.noreply.github.com>2019-07-14 00:35:58 -0500
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-07-13 22:35:58 -0700
commitdffca9e925ee5c3072663cbe8d4d4768406d5307 (patch)
treed7a4e205a3dc47cb6e327c8df1d8f6cae4bf9483
parent014847034bfc67e7b7d7e9e01d664e1e8864be9d (diff)
downloadcpython-git-dffca9e925ee5c3072663cbe8d4d4768406d5307.tar.gz
bpo-26967: fix flag grouping with allow_abbrev=False (GH-14316)
The `allow_abbrev` option for ArgumentParser is documented and intended to disable support for unique prefixes of --options, which may sometimes be ambiguous due to deferred parsing. However, the initial implementation also broke parsing of grouped short flags, such as `-ab` meaning `-a -b` (or `-a=b`). Checking the argument for a leading `--` before rejecting it fixes this. This was prompted by pytest-dev/pytest#5469, so a backport to at least 3.8 would be great :smile: And this is my first PR to CPython, so please let me know if I've missed anything! https://bugs.python.org/issue26967
-rw-r--r--Doc/library/argparse.rst4
-rw-r--r--Lib/argparse.py2
-rw-r--r--Lib/test/test_argparse.py19
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS.d/next/Library/2019-06-23-12-46-10.bpo-26967.xEuem1.rst3
5 files changed, 28 insertions, 1 deletions
diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst
index b77a38ccd4..ef2fd42783 100644
--- a/Doc/library/argparse.rst
+++ b/Doc/library/argparse.rst
@@ -182,6 +182,10 @@ ArgumentParser objects
.. versionchanged:: 3.5
*allow_abbrev* parameter was added.
+ .. versionchanged:: 3.8
+ In previous versions, *allow_abbrev* also disabled grouping of short
+ flags such as ``-vv`` to mean ``-v -v``.
+
The following sections describe how each of these are used.
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 4f3aea928b..e45b67b677 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -2130,7 +2130,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
action = self._option_string_actions[option_string]
return action, option_string, explicit_arg
- if self.allow_abbrev:
+ if self.allow_abbrev or not arg_string.startswith('--'):
# search through all possible prefixes of the option string
# and all actions in the parser for possible interpretations
option_tuples = self._get_option_tuples(arg_string)
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 9079d4bc7a..5128dc5e1b 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -785,6 +785,25 @@ class TestOptionalsDisallowLongAbbreviation(ParserTestCase):
('--foonly 7 --foodle --foo 2', NS(foo='2', foodle=True, foonly='7')),
]
+
+class TestDisallowLongAbbreviationAllowsShortGrouping(ParserTestCase):
+ """Do not allow abbreviations of long options at all"""
+
+ parser_signature = Sig(allow_abbrev=False)
+ argument_signatures = [
+ Sig('-r'),
+ Sig('-c', action='count'),
+ ]
+ failures = ['-r', '-c -r']
+ successes = [
+ ('', NS(r=None, c=None)),
+ ('-ra', NS(r='a', c=None)),
+ ('-rcc', NS(r='cc', c=None)),
+ ('-cc', NS(r=None, c=2)),
+ ('-cc -ra', NS(r='a', c=2)),
+ ('-ccrcc', NS(r='cc', c=2)),
+ ]
+
# ================
# Positional tests
# ================
diff --git a/Misc/ACKS b/Misc/ACKS
index b2a6011019..3e6a0aca35 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -645,6 +645,7 @@ Travis B. Hartwell
Shane Harvey
Larry Hastings
Tim Hatch
+Zac Hatfield-Dodds
Shane Hathaway
Michael Haubenwallner
Janko Hauser
diff --git a/Misc/NEWS.d/next/Library/2019-06-23-12-46-10.bpo-26967.xEuem1.rst b/Misc/NEWS.d/next/Library/2019-06-23-12-46-10.bpo-26967.xEuem1.rst
new file mode 100644
index 0000000000..c5852f6142
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-06-23-12-46-10.bpo-26967.xEuem1.rst
@@ -0,0 +1,3 @@
+An :class:`~argparse.ArgumentParser` with ``allow_abbrev=False`` no longer
+disables grouping of short flags, such as ``-vv``, but only disables
+abbreviation of long flags as documented. Patch by Zac Hatfield-Dodds.