Ce n'est pas bon (aussi, car intercepte toutes les erreurs), mais:
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(...)
...
Voici la définition de la error
fonction de la ArgumentParser
classe:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Comme vous le voyez, après la signature, il faut deux arguments. Cependant, les fonctions en dehors de la classe ne connaissent pas le premier argument: self
car, en gros, c'est un paramètre pour la classe. (Je sais que tu sais ...) De ce fait, juste passer propre self
et message
en _error(...)
ne peut pas (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
affichera:
...
"AttributeError: 'str' object has no attribute 'print_help'"
). Vous pouvez passer parser
( self
) en _error
fonction, en l'appelant:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, mais vous ne voulez pas quitter le programme pour le moment. Puis retournez-le:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
. Néanmoins, parser
ne sait pas, qu'il a été modifié, donc quand une erreur se produit, il en enverra la cause (à propos, sa traduction localisée). Eh bien, interceptez-le:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
. Maintenant, quand une erreur se produit et parser
enverra la cause de celle-ci, vous l'intercepterez, la regarderez et ... la jeterez.