Index: Lib/argparse.py =================================================================== --- Lib/argparse.py (revision 83676) +++ Lib/argparse.py (working copy) @@ -1070,7 +1070,7 @@ raise ArgumentError(self, msg) # parse all the remaining options into the namespace - parser.parse_args(arg_strings, namespace) + parser.parse_args_record_unrecognized(arg_strings, namespace) # ============== @@ -1659,7 +1659,23 @@ msg = _('unrecognized arguments: %s') self.error(msg % ' '.join(argv)) return args + + def parse_args_record_unrecognized(self, args=None, namespace=None): + """Allows deferral of decision on whether to exit upon hitting + an unrecognized argument, since it may originate either with + parse_args or parse_known_args.""" + args, argv = self.parse_known_args(args, namespace) + if argv: + if not hasattr(args, '_unrecognized'): + args._unrecognized = [] + args._unrecognized.extend(argv) + return args + def retrieve_recorded_unrecognized_args(self, args, argv): + if hasattr(args, '_unrecognized'): + argv.extend(args._unrecognized) + delattr(args, '_unrecognized') + def parse_known_args(self, args=None, namespace=None): # args default to the system args if args is None: @@ -1686,7 +1702,9 @@ # parse the arguments and exit if there are any errors try: - return self._parse_known_args(args, namespace) + (recognized, unrecognized) = self._parse_known_args(args, namespace) + self.retrieve_recorded_unrecognized_args(recognized, unrecognized) + return (recognized, unrecognized) except ArgumentError: err = _sys.exc_info()[1] self.error(str(err))