Questo non va bene (anche perché intercetta tutti gli errori), ma:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
parser.add_argument(...)
...
Ecco la definizione della error
funzione della ArgumentParser
classe:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Come vedi, dopo la firma, ci vogliono due argomenti. Tuttavia, le funzioni al di fuori della classe non sanno nulla del primo argomento: self
perché, in termini approssimativi, questo è un parametro per la classe. (Lo so, che tu sai ...) In tal modo, basta passare proprio self
e message
in _error(...)
non può (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
produrrà:
...
"AttributeError: 'str' object has no attribute 'print_help'"
). Puoi passare parser
( self
) in _error
funzione, chiamandolo:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, ma non vuoi uscire dal programma, in questo momento. Quindi restituirlo:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
. Tuttavia, parser
non sa che è stato modificato, quindi quando si verifica un errore, ne invierà la causa (a proposito, la sua traduzione localizzata). Bene, allora intercettalo:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
. Ora, quando si verifica un errore e parser
ne invierai la causa, lo intercetterai, guarderai questo e ... lo eliminerai.