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()))