0

私はいくつかのargparseコードをテストしています。n選択肢のリストから入力の数を収集するオプションの引数が必要でした。だから、私は書いた:

import argparse

modules = ["geo", "loc"]
parser = argparse.ArgumentParser()
parser.add_argument("--modules", nargs='*', choices=modules)

この設定で、私は確実に通訳者を完全に殺すことができます。

有効な引数のセットを渡せば、正常に機能します。

>>> parser.parse_args("--module geo loc geo".split())
Namespace(modules=['geo', 'loc', 'geo'])

しかし、誤って形成された引数を渡すと、Pythonは完全に強制終了されます。

>>> parser.parse_args("--module geo metro".split())
usage: [-h] [--modules [{geo,loc} [{geo,loc} ...]]]
: error: argument --modules: invalid choice: 'metro' (choose from 'geo', 'loc')
PS C:\Users\myname\mycode>

私の質問は2つあります。

  1. これは予想される動作ですか?もしそうなら、これの理由は何ですか?
  2. プログラムが不正な引数で終了してもかまわないので、このコードを使用しても大丈夫ですか?それとも、これを避けるための説得力のある理由がありますか?

注意として、私はWindows7でPython2.7を使用しています。

4

2 に答える 2

3
  1. はい、これは意図されており、文書化されています。

    コマンドラインの解析中に、parse_args()は、あいまいなオプション、無効なタイプ、無効なオプション、間違った数の位置引数など、さまざまなエラーをチェックします。このようなエラーが発生すると、終了し、エラーとともにエラーを出力します。使用法メッセージ:

    アイデアは、ユーザーが処理方法がわからない無効なオプションまたは引数を与えた場合、ユーザーの実際の意図を二度と推測するのではなく、あきらめるのが最善のオプションであるということです。

  2. よろしければ大丈夫ですよね?異なる動作を実装する理由がわからない限り、プログラムはすべてのプラットフォームで正常に動作するすべてのコマンドラインツールと完全に一致しています。

別の動作を実装する場合は、発生する可能性のあるSystemExit例外をキャッチしますparse_args

(私が考えることができる唯一のプログラムは、今説明した方法とは異なる動作をします。バージョン管理ツールGitは、ユーザーが何を意味するのかを推測し、その推測を出力します。ただし、それでも終了します。)

于 2013-02-21T23:22:24.487 に答える
1

argparsePythonスクリプトをコマンドラインから実行するときに使用するように設計されています。そのため、無効な引数によってプログラムが終了します。

この動作は、事実上すべてのシェル(bash / sh / dos / etc。)ユーティリティと一致しています。無効なコマンドライン引数により、プログラムはエラー文字列と(オプションで)使用法メッセージで終了します。

于 2013-02-21T23:19:04.763 に答える