from argparse import ArgumentParser, SUPPRESS, REMAINDER import sys print( sys.version ) class ErrorArgumentParser( ArgumentParser ): def __init__( self, *args, **kwargs ): self.__errorobj = None ArgumentParser.__init__( self, *args, **kwargs ) def error( self, message ): if self.__errorobj: self.__errorobj.error( message ) else: ArgumentParser.error( self, message ) def seterror( self, errorobj ): self.__errorobj = errorobj class CompatibleArgumentParser( ArgumentParser ): def __init__( self, *args, **kwargs ): self.__setup = False self.__opt = ErrorArgumentParser( *args, **kwargs ) ArgumentParser.__init__( self, *args, **kwargs ) self.__opt.seterror( self ) self.__setup = True def add_argument( self, *args, **kwargs ): ArgumentParser.add_argument( self, *args, **kwargs ) if self.__setup: chars = self.prefix_chars if not args or len(args) == 1 and args[0][0] not in chars: pass else: self.__opt.add_argument( *args, **kwargs ) def parse_args( self, args=None, namespace=None ): ns, remain = self.__opt.parse_known_args( args, namespace ) ns = ArgumentParser.parse_args( self, remain, ns ) return ns parser = CompatibleArgumentParser() parser.add_argument('--foo', dest='foo') parser.add_argument('--bar', dest='bar') parser.add_argument('foz') # parser.add_argument('baz', nargs='*') print( parser.parse_args('a b c d --foo x --bar 1'.split())) print( parser.parse_args('--foo x a b c d --bar 1'.split())) print( parser.parse_args('--foo x --bar 1 a b c d'.split())) print( parser.parse_args('a b --foo x --bar 1 c d'.split()))