Подтвердить что ты не робот

Я хочу, чтобы Python argparse выдавал исключение, а не использование

Я не думаю, что это возможно, но я хочу сам обрабатывать исключения из argparse.

Например:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', required=True)
try:
    args = parser.parse_args()
except:
    do_something()

Когда я запустил его:

$ myapp.py
usage: myapp --foo foo
myapp: error: argument --foo is required

Но я хочу, чтобы он попал в исключение.

4b9b3361

Ответ 1

Вы можете подклассифицировать ArgumentParser и переопределить метод error, чтобы сделать что-то другое при возникновении ошибки:

class ArgumentParserError(Exception): pass

class ThrowingArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        raise ArgumentParserError(message)

parser = ThrowingArgumentParser()
parser.add_argument(...)
...

Ответ 2

в моем случае, argparse печатает "слишком мало аргументов", а затем завершает работу. после прочтения кода argparse, я нашел, что он просто вызывает sys.exit() после печати некоторого сообщения. поскольку sys.exit() делает только исключение SystemExit, вы можете просто зафиксировать это исключение.

попробуйте это, чтобы увидеть, работает ли оно для вас.

    try:
        args = parser.parse_args(args)
    except SystemExit:
        .... your handler here ...
        return