# HG changeset patch # User Laszlo Attila Toth # Date 1329492844 -3600 # Branch 2.7 # Node ID 184d8b9b32f9c36d83d04215e54842ae8eceac91 # Parent a1f17e108a1ba1a8285a0a137583a1d073224c86 argparse: added support of disabling interspersed args ArgumentParser got disable_interspersed_args() which exists in optparse.OptionParser() diff --git a/Lib/argparse.py b/Lib/argparse.py --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1584,6 +1584,7 @@ self._positionals = add_group(_('positional arguments')) self._optionals = add_group(_('optional arguments')) self._subparsers = None + self._disabled_interspersed_args = False # register types def identity(string): @@ -1615,6 +1616,9 @@ else: self._defaults.update(defaults) + def disable_interspersed_args(self): + self._disabled_interspersed_args = True + # ======================= # Pretty __repr__ methods # ======================= @@ -1750,8 +1754,12 @@ for i, arg_string in enumerate(arg_strings_iter): # all args after -- are non-options - if arg_string == '--': - arg_string_pattern_parts.append('-') + # If options and non-options cannot mix, + # all remaining args are non-options + if (arg_string and arg_string[0] not in self.prefix_chars and \ + self._disabled_interspersed_args) or arg_string == '--': + part = '-' if arg_string == '--' else 'A' + arg_string_pattern_parts.append(part) for arg_string in arg_strings_iter: arg_string_pattern_parts.append('A') diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -1629,6 +1629,43 @@ NS(x='my_type{1}', y='my_type{42}')) +# =============================== +# Test Interspersed args and '--' +# =============================== + +class TestInterspersedArgs(TestCase): + def setUp(self): + self.parser = ErrorRaisingArgumentParser() + self.parser.add_argument('-a', action='store_true') + self.parser.add_argument('foo') + self.parser.add_argument('rem', nargs='*') + + def test_simple(self): + self.assertEquals(self.parser.parse_args('-a 3 5 6 9'.split()), + NS(a=True, foo='3', rem=['5', '6', '9'])) + self.assertEquals(self.parser.parse_args('3 -a'.split()), + NS(a=True, foo='3', rem=[])) + self.assertEquals(self.parser.parse_args('3 4 5 -a'.split()), + NS(a=True, foo='3', rem=['4', '5'])) + + def test_hyphens(self): + self.assertEquals(self.parser.parse_args('-a -- 3 5 6 9'.split()), + NS(a=True, foo='3', rem=['5', '6', '9'])) + self.assertEquals(self.parser.parse_args('-- 3 -a'.split()), + NS(a=False, foo='3', rem=['-a'])) + self.assertEquals(self.parser.parse_args('-- 3 4 5 -a'.split()), + NS(a=False, foo='3', rem=['4', '5', '-a'])) + + def test_interspersed_args(self): + self.parser.disable_interspersed_args() + self.assertEquals(self.parser.parse_args('-a 3 5 6 9'.split()), + NS(a=True, foo='3', rem=['5', '6', '9'])) + self.assertEquals(self.parser.parse_args('3 -a'.split()), + NS(a=False, foo='3', rem=['-a'])) + self.assertEquals(self.parser.parse_args('3 4 5 -a'.split()), + NS(a=False, foo='3', rem=['4', '5', '-a'])) + + # ============ # Action tests # ============