PythonArgumentParserでエラーを処理する

シッダールトシュクラ

parse_args()引数の値が不明な場合にエラースローされる状況を手動で処理したいと思います。例:次のPythonファイルがある場合script.py

argp = argparse.ArgumentParser(description='example')
argp.add_argument('--compiler', choices=['default', 'clang3.4', 'clang3.5'])
args = argp.parse_args()

次の引数を使用しpython script.py --compiler=fooスクリプトを実行すると、次のエラーがスローされます。

error: argument --compiler: invalid choice: 'foo' (choose from 'default', 'clang3.4', 'clang3.5')
SystemExit: 2

スクリプトがそれ自体を終了するのではなく、この動作を自分で処理するために何をする必要がありますか?1つのアイデアは、メソッドをサブクラス化argparse.ArgumentParserしてオーバーライドするparse_args()か、単にモンキーパッチを適用することですが、標準ライブラリの動作をオーバーライドする必要のない、より良い方法があるかどうか疑問に思いました。

hpaulj

選択肢を定義することの全体的なポイントは、リストにない値についてパーサーに文句を言わせることです。しかし、いくつかの選択肢があります。

  • 選択肢を省略し(必要に応じてヘルプテキストに含めます)、解析後に独自のテストを行います。argparseあなたのためにすべてをする必要はありません。主な目的は、ユーザーが何を望んでいるかを理解することです。

  • parser.errorメソッドを再定義して(サブクラス化が最適です)、からエラーをリダイレクトしますsys.exitただし、このエラーとパーサーが発生する可能性のある他のエラーを区別するには、エラーメッセージを解析する必要があります。

  • type選択肢をチェックし、デフォルトの置換を行う関数を定義します。

'--compiler'オプションの解析は次のようになります。

  • --compilerフラグの後に文字列引数を取得します
  • type関数に渡します。デフォルトはlambda x:xです。int整数などに変換しValueErrorます。値上げは値が悪いです。
  • 戻り値をchoicesリスト(ある場合)と照合します
  • を使用actionして名前空間に値を追加します(デフォルトでは単に値を格納します)。

これらのステップのいずれかでエラーが発生するArgumentErrorと、parser.errorメソッドによってトラップされてメソッドに渡されるが生成されparser.exitます。

以来store_actionした後に発生typeし、choicesチェック、カスタムアクションしません自分のエラーバイパス。

考えられるtype解決策は次のとおりです(テストされていません)

def compile_choices(astr):
   if astr in ['default', 'clang3.4', 'clang3.5']:
       return astr
   else:
       return 'default'
   # could raise ValueError('bad value') if there are some strings you don't like

argp.add_argument('--compiler', type=compile_choices)

=================

compile_choices選択肢のリストやデフォルトなど、他の引数を取る場合は、解析する前に、それらの値を定義する理由をいくつかラップする必要があります。

バイナリ文字列表現を受け入れる例:

parser.add_argument('--binary', type=lambda x: int(x, base=2),
    help='integer in binary format', default='1010')

または

parser.add_argument('--binary', type=functools.partial(int, base=2), default='1010')

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

RubyでJSONパーサーエラーを処理する方法

分類Dev

AngularMaterialでサーバー側のエラーを処理する

分類Dev

NoneTypeエラーを処理する方法

分類Dev

MaterialUIでフォームエラーを処理するReactJS

分類Dev

リゾルバーでエラーを処理する方法

分類Dev

リゾルバーでエラーを処理する方法

分類Dev

AngularJSで$ resourceサービスエラーを処理する方法

分類Dev

リゾルバーでエラーを処理する方法

分類Dev

nestjsでマングースエラーを処理する方法

分類Dev

Xamarin.formsWebviewでロードエラーを処理する方法

分類Dev

致命的なエラーを処理および処理する方法

分類Dev

liveDataでエラーを処理する方法

分類Dev

boto3でエラーを処理する方法

分類Dev

fork()の後でexecvp(...)エラーを処理する方法は?

分類Dev

goroutineでエラーを処理する方法

分類Dev

関数のhttp.Getでエラーを処理する方法

分類Dev

Goで特定のエラーを指定して処理する方法

分類Dev

golangで特定のエラーを処理する

分類Dev

LiveDataでエラー状態を処理する方法は?

分類Dev

RxJava:zip演算子でエラーを処理する方法

分類Dev

Restifyでエラーを処理(つまりログ)する方法

分類Dev

TopShelfで非同期Start()エラーを処理する方法

分類Dev

Express4で404エラーを処理する

分類Dev

Apolloスタックでエラーを処理する方法

分類Dev

Dropbox C#SDKでエラーを処理する方法は?

分類Dev

UnityでFirebase認証エラーを処理する方法

分類Dev

multiprocessing.Poolで初期化エラーを処理する方法は?

分類Dev

Rで浮動小数点エラーを処理する方法

分類Dev

MongoDB / mongooseでキャストエラーを処理する方法

Related 関連記事

  1. 1

    RubyでJSONパーサーエラーを処理する方法

  2. 2

    AngularMaterialでサーバー側のエラーを処理する

  3. 3

    NoneTypeエラーを処理する方法

  4. 4

    MaterialUIでフォームエラーを処理するReactJS

  5. 5

    リゾルバーでエラーを処理する方法

  6. 6

    リゾルバーでエラーを処理する方法

  7. 7

    AngularJSで$ resourceサービスエラーを処理する方法

  8. 8

    リゾルバーでエラーを処理する方法

  9. 9

    nestjsでマングースエラーを処理する方法

  10. 10

    Xamarin.formsWebviewでロードエラーを処理する方法

  11. 11

    致命的なエラーを処理および処理する方法

  12. 12

    liveDataでエラーを処理する方法

  13. 13

    boto3でエラーを処理する方法

  14. 14

    fork()の後でexecvp(...)エラーを処理する方法は?

  15. 15

    goroutineでエラーを処理する方法

  16. 16

    関数のhttp.Getでエラーを処理する方法

  17. 17

    Goで特定のエラーを指定して処理する方法

  18. 18

    golangで特定のエラーを処理する

  19. 19

    LiveDataでエラー状態を処理する方法は?

  20. 20

    RxJava:zip演算子でエラーを処理する方法

  21. 21

    Restifyでエラーを処理(つまりログ)する方法

  22. 22

    TopShelfで非同期Start()エラーを処理する方法

  23. 23

    Express4で404エラーを処理する

  24. 24

    Apolloスタックでエラーを処理する方法

  25. 25

    Dropbox C#SDKでエラーを処理する方法は?

  26. 26

    UnityでFirebase認証エラーを処理する方法

  27. 27

    multiprocessing.Poolで初期化エラーを処理する方法は?

  28. 28

    Rで浮動小数点エラーを処理する方法

  29. 29

    MongoDB / mongooseでキャストエラーを処理する方法

ホットタグ

アーカイブ