]> granicus.if.org Git - python/commitdiff
bpo-26967: fix flag grouping with allow_abbrev=False (GH-14316)
authorZac Hatfield-Dodds <Zac-HD@users.noreply.github.com>
Sun, 14 Jul 2019 05:35:58 +0000 (00:35 -0500)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 14 Jul 2019 05:35:58 +0000 (22:35 -0700)
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

Doc/library/argparse.rst
Lib/argparse.py
Lib/test/test_argparse.py
Misc/ACKS
Misc/NEWS.d/next/Library/2019-06-23-12-46-10.bpo-26967.xEuem1.rst [new file with mode: 0644]

index b77a38ccd485776b720d77d858aa5ae70b3db2f7..ef2fd42783c87722a0899cdabce0e28ccaf8ad27 100644 (file)
@@ -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.
 
 
index 4f3aea928bf6f449110e4ebac8e4aed0656aaabb..e45b67b67704a98364cc52a99c3147fd46a13185 100644 (file)
@@ -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)
index 9079d4bc7aa7fd9dd491b7a1f91e17594aac1124..5128dc5e1be4998d8128578d25c8d38ce474dce5 100644 (file)
@@ -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
 # ================
index b2a6011019c2d304a1d1ac859b2ed1dc52b3eadc..3e6a0aca35731dea7d709ec53de6147fa12e3183 100644 (file)
--- 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 (file)
index 0000000..c5852f6
--- /dev/null
@@ -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.