diff -r fbac8f321937 Lib/argparse.py --- a/Lib/argparse.py Wed Apr 27 11:31:14 2011 +0100 +++ b/Lib/argparse.py Sun May 29 21:09:41 2011 +0800 @@ -1590,8 +1590,9 @@ fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', - add_help=True): - + add_help=True, + exit_on_error=True): + if version is not None: import warnings warnings.warn( @@ -1617,6 +1618,7 @@ self.formatter_class = formatter_class self.fromfile_prefix_chars = fromfile_prefix_chars self.add_help = add_help + self.exit_on_error = exit_on_error add_group = self.add_argument_group self._positionals = add_group(_('positional arguments')) @@ -1754,15 +1756,19 @@ setattr(namespace, dest, self._defaults[dest]) # parse the arguments and exit if there are any errors - try: + if not self.exit_on_error: namespace, args = self._parse_known_args(args, namespace) - if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): - args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) - delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) - return namespace, args - except ArgumentError: - err = _sys.exc_info()[1] - self.error(str(err)) + else: + try: + namespace, args = self._parse_known_args(args, namespace) + except ArgumentError: + err = _sys.exc_info()[1] + self.error(str(err)) + + if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): + args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) + delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) + return namespace, args def _parse_known_args(self, arg_strings, namespace): # replace arg strings that are file references diff -r fbac8f321937 Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py Wed Apr 27 11:31:14 2011 +0100 +++ b/Lib/test/test_argparse.py Sun May 29 21:09:41 2011 +0800 @@ -4504,6 +4504,23 @@ self.assertEqual(NS(v=3, spam=True, badger="B"), args) self.assertEqual(["C", "--foo", "4"], extras) +# =========================== +# test the exit_on_error flag +# =========================== + +class TestExitOnError(TestCase): + + def setUp(self): + self.parser = argparse.ArgumentParser(exit_on_error=False) + self.parser.add_argument('--integers', metavar='N', type=int) + + def test_exit_on_error_accepts_good_input(self): + self.parser.parse_args("--integers 4".split()) + + def test_exit_on_error_rejects_bad_input(self): + with self.assertRaises(argparse.ArgumentError): + self.parser.parse_args("--integers a".split()) + # ========================== # add_argument metavar tests # ==========================