Argparse: 必須引数は「オプション引数」の下にリストされていますか? 質問する

Argparse: 必須引数は「オプション引数」の下にリストされていますか? 質問する

いくつかの引数を解析するために、次の簡単なコードを使用します。引数の 1 つは必須であることに注意してください。残念ながら、ユーザーが引数を指定せずにスクリプトを実行すると、表示される使用方法/ヘルプ テキストにオプションではない引数があることが示されず、非常に混乱します。引数がオプションではないことを Python で示すにはどうすればよいですか?

コードは次のとおりです:

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='Foo')
    parser.add_argument('-i','--input', help='Input file name', required=True)
    parser.add_argument('-o','--output', help='Output file name', default="stdout")
    args = parser.parse_args()
    print ("Input file: %s" % args.input )
    print ("Output file: %s" % args.output )

必要な引数を指定せずに上記のコードを実行すると、次の出力が得られます。

usage: foo.py [-h] -i INPUT [-o OUTPUT]

Foo

optional arguments:
    -h, --help            show this help message and exit
    -i INPUT, --input INPUT
                          Input file name
    -o OUTPUT, --output OUTPUT
                          Output file name

ベストアンサー1

-またはで始まるパラメータは--通常オプションと見なされます。その他のすべてのパラメータは位置パラメータであり、設計上必須です (位置関数引数と同様)。オプション引数を必須にすることは可能ですが、これは設計に少し反します。それらは非位置引数の一部であるため、必須であっても「オプション引数」という紛らわしい見出しの下にリストされます。ただし、使用方法部分に角括弧がないため、それらは確かに必須であることがわかります。

以下も参照ドキュメンテーション:

一般に、argparse モジュールは、-f や --bar などのフラグがオプションの引数を示し、コマンドラインでは常に省略できるものと想定します。

注:必須オプションは、ユーザーがオプションを任意であると想定しているため、通常は不適切な形式と見なされ、可能な場合は避ける必要があります。

そうは言っても、ヘルプのヘッダー「位置引数」「オプション引数」は、引数が自動的に分離される 2 つの引数グループによって生成されます。ここで、「ハッキング」してオプション引数の名前を変更することもできますが、はるかにエレガントな解決策は、「必須の名前付き引数」(または任意の名前) 用に別のグループを作成することです。

parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('-o', '--output', help='Output file name', default='stdout')
requiredNamed = parser.add_argument_group('required named arguments')
requiredNamed.add_argument('-i', '--input', help='Input file name', required=True)
parser.parse_args(['-h'])
usage: [-h] [-o OUTPUT] -i INPUT

Foo

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        Output file name

required named arguments:
  -i INPUT, --input INPUT
                        Input file name

おすすめ記事