+ def parse_known_args(self, args=None, values=None, strict=True):
+ """Same as parse_args, but ignore unknown switches. Similar to argparse.parse_known_args"""
+ self.rargs, self.largs = self._get_args(args), []
+ self.values = values or self.get_default_values()
+ while self.rargs:
+ try:
+ self._process_args(self.largs, self.rargs, self.values)
+ except optparse.OptParseError as err:
+ if isinstance(err, self._UNKNOWN_OPTION):
+ self.largs.append(err.opt_str)
+ elif strict:
+ if isinstance(err, self._BAD_OPTION):
+ self.error(str(err))
+ raise
+ return self.check_values(self.values, self.largs)
+
+ def error(self, msg):
+ msg = f'{self.get_prog_name()}: error: {str(msg).strip()}\n'
+ raise optparse.OptParseError(f'{self.get_usage()}\n{msg}' if self.usage else msg)
+
+ def _get_args(self, args):
+ return sys.argv[1:] if args is None else list(args)
+
+ def _match_long_opt(self, opt):
+ """Improve ambigious argument resolution by comparing option objects instead of argument strings"""
+ try:
+ return super()._match_long_opt(opt)
+ except optparse.AmbiguousOptionError as e:
+ if len({self._long_opt[p] for p in e.possibilities}) == 1:
+ return e.possibilities[0]
+ raise
+
+
+def create_parser():