Це не добре (також, тому що перехоплює всі помилки), але:
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
викличе її причину, ви її перехопите, подивіться на це і ... викиньте.