@@ -737,6 +737,37 @@ def parse_args(self, args=None, namespace=None, **kwargs):
737737 self ._namespace ._command = join (self ._tokens )
738738 return self ._namespace
739739
740+ def parse_known_args (self , args = None , namespace = None ):
741+ args = _sys .argv [1 :] if args is None else list (args )
742+ # default Namespace built from parser defaults
743+ if namespace is None :
744+ namespace = Namespace (self )
745+ # add any action defaults that aren't present
746+ for action in self ._actions :
747+ if action .dest is not SUPPRESS :
748+ if not hasattr (namespace , action .dest ):
749+ if action .default is not SUPPRESS :
750+ setattr (namespace , action .dest , action .default )
751+ # add any parser defaults that aren't present
752+ for dest in self ._defaults :
753+ if not hasattr (namespace , dest ):
754+ setattr (namespace , dest , self ._defaults [dest ])
755+ # parse the arguments and exit if there are any errors
756+ if self .exit_on_error :
757+ try :
758+ namespace , args = self ._parse_known_args (args , namespace )
759+ except ArgumentError as err :
760+ self .error (str (err ))
761+ else :
762+ namespace , args = self ._parse_known_args (args , namespace )
763+ if hasattr (namespace , _UNRECOGNIZED_ARGS_ATTR ):
764+ args .extend (set (getattr (namespace , _UNRECOGNIZED_ARGS_ATTR )))
765+ try :
766+ delattr (namespace , _UNRECOGNIZED_ARGS_ATTR )
767+ except :
768+ pass
769+ return namespace , args
770+
740771 def print_extended_help (self , level = 1 , file = None ):
741772 if not isinstance (self .details , (tuple , list , set )):
742773 self .details = [self .details ]
0 commit comments