Esto no es bueno (también, porque intercepta todos los errores), pero:
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(...)
...
Aquí está la definición de la error
función de la ArgumentParser
clase:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Como puede ver, después de la firma, se necesitan dos argumentos. Sin embargo, las funciones fuera de la clase no saben nada sobre el primer argumento: self
porque, en términos generales, este es un parámetro para la clase. (Lo sé, que usted sabe ...) Por lo tanto, sólo tiene que pasar propia self
y message
en _error(...)
no puede (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
dará salida:
...
"AttributeError: 'str' object has no attribute 'print_help'"
) Puede pasar parser
( self
) en _error
función, llamándolo:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, pero no quieres salir del programa, ahora mismo. Luego devuélvelo:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
. Sin embargo, parser
no sabe que se ha modificado, por lo tanto, cuando se produce un error, enviará la causa (por cierto, su traducción localizada). Bueno, entonces interceptarlo:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
. Ahora, cuando ocurre un error y parser
enviará la causa del mismo, lo interceptarás, mirarás esto y ... lo arrojarás.