Isso não é bom (também porque intercepta todos os erros), mas:
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(...)
...
Aqui está a definição da error
função da ArgumentParser
classe:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Como você vê, após a assinatura, são necessários dois argumentos. No entanto, funções fora da classe nada sabem sobre o primeiro argumento: self
porque, grosso modo, esse é um parâmetro para a classe. (Eu sei, que você sabe ...) Assim, basta passar própria self
e message
em _error(...)
não pode (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
irá produzir:
...
"AttributeError: 'str' object has no attribute 'print_help'"
) Você pode passar parser
( self
) na _error
função, chamando-a:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, mas você não deseja sair do programa no momento. Depois devolva:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
. No entanto, parser
não sabe, que ele foi modificado; assim, quando ocorrer um erro, ele será responsável (a propósito, sua tradução localizada). Bem, então intercepte:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
. Agora, quando ocorrer um erro e parser
enviar sua causa, você o interceptará, examinará isso e ... jogará fora.