Это не хорошо (также, потому что перехватывает все ошибки), но:
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(...)
...
Вот определение error
функции ArgumentParser
класса:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
, Как видите, после подписи требуется два аргумента. Однако функции вне класса ничего не знают о первом аргументе: self
потому что, грубо говоря, это параметр для класса. (Я знаю, что вы знаете ...) Таким образом, просто пройти самостоятельно self
и message
в _error(...)
не может (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
будет выводить:
...
"AttributeError: 'str' object has no attribute 'print_help'"
). Вы можете передать parser
( self
) в _error
функцию, вызвав ее:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, но вы не хотите выходить из программы прямо сейчас. Затем верните это:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
, Тем parser
не менее, не знает, что оно было модифицировано, поэтому при возникновении ошибки он отправит причину этого (кстати, его локализованный перевод). Ну, тогда перехватите это:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
, Теперь, когда ошибка произойдет и parser
отправит причину, вы перехватите ее, посмотрите на это и ... выбросите.