diff -r 1c48171fc8da Lib/argparse.py --- a/Lib/argparse.py Sat Aug 23 14:48:22 2014 +1000 +++ b/Lib/argparse.py Tue Sep 23 15:53:25 2014 -0700 @@ -2121,6 +2121,19 @@ if not self._has_negative_number_optionals: return None + if '=' in arg_string: + # added test to allow space in the argument part of a '=' string + # such a string is treated as positional only if the space is in the 1st part + # otherwise it is an 'unknown' + # is there any backward compatibility issue with adding this test? + # issue 22433 + option_prefix, explicit_arg = arg_string.split('=', 1) + if ' ' in option_prefix: + return None + else: + return None, arg_string, None + + # if it contains a space, it was meant to be a positional if ' ' in arg_string: return None diff -r 1c48171fc8da Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py Sat Aug 23 14:48:22 2014 +1000 +++ b/Lib/test/test_argparse.py Tue Sep 23 15:53:25 2014 -0700 @@ -4737,6 +4737,29 @@ self.assertEqual(NS(v=3, spam=True, badger="B"), args) self.assertEqual(["C", "--foo", "4"], extras) + def test_space(self): + # test handling of spaces in argument of unknown optional; issue 22433 + parser = argparse.ArgumentParser() + parser.add_argument('--foo') + parser.add_argument('pos') + args, extras = parser.parse_known_args(['xxx', '--foo=one_two', '--bar=one_two']) + self.assertEqual(NS(foo='one_two', pos='xxx'), args) + self.assertEqual(['--bar=one_two'], extras) + + args, extras = parser.parse_known_args(['xxx', '--foo=one two', '--bar=one two']) + if True: + # with 22433 patch; space ok in argument of unknown optional + self.assertEqual(NS(foo='one two', pos='xxx'), args) + self.assertEqual(['--bar=one two'], extras) + else: + # for existing code; all strings with space assumed to be positional + self.assertEqual(NS(foo='one two', pos='--bar=one two'), args) + self.assertEqual(['xxx'], extras) + # space in flag slot makes it a positional argument + args, extras = parser.parse_known_args(['--foo bar=one_two', 'xxx']) + self.assertEqual(NS(foo=None, pos='--foo bar=one_two'), args) + self.assertEqual(['xxx'], extras) + # ========================== # add_argument metavar tests # ==========================