Это нехорошо (также потому, что перехватывает все ошибки), но:
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
сообщит ее причину, вы ее перехватите, посмотрите на это и ... выбросите.
person
hesed
schedule
16.03.2020