web-dev-qa-db-ja.com

Python argparseが使用ではなく例外をスローするようにしたい

これは可能ではないと思いますが、自分自身でa​​rgparseからの例外を処理したいと思います。

例えば:

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

しかし、私はそれが例外に該当することを望みます。

36
joedborg

エラーが発生したときにArgumentParserをサブクラス化し、errorメソッドをオーバーライドして別のことを行うことができます。

class ArgumentParserError(Exception): pass

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

parser = ThrowingArgumentParser()
parser.add_argument(...)
...
66
Ned Batchelder

私の場合、argparseは「引数が少なすぎます」と表示して終了します。 argparseコードを読んだ後、メッセージを出力した後にsys.exit()を呼び出すだけでした。 sys.exit()はSystemExit例外をスローするだけなので、この例外をキャプチャするだけで済みます。

これを試して、うまくいくかどうかを確認してください。

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