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