web-dev-qa-db-ja.com

Argparse:必須の引数は "optional arguments"の下にリストされていますか?

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

これがコードです:

import argparse
if __== '__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
164
mort

-または--で始まるパラメーターは通常オプションと見なされます。他のすべてのパラメータは位置パラメータであり、それ自体は設計上必要なものです(位置関数引数など)。オプションの引数を要求することは可能ですが、これは彼らの設計に対して少しです。それらはまだ非定位置引数の一部であるため、それらが必要であっても混乱を招くヘッダ「オプションの引数」の下にリストされます。使用法の部分で欠けている角括弧は、しかしながら、それらが本当に必要であることを示しています。

ドキュメント も参照してください。

一般に、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
237
poke

私はオプションの前に必須の引数をリストすることを好むので、私はそれを回避します:

    parser = argparse.ArgumentParser()
    parser._action_groups.pop()
    required = parser.add_argument_group('required arguments')
    optional = parser.add_argument_group('optional arguments')
    required.add_argument('--required_arg', required=True)
    optional.add_argument('--optional_arg')
    return parser.parse_args()

そしてこの出力:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
               [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

optional arguments:
  --optional_arg OPTIONAL_ARG

私はオプションの引数グループに現れる「助け」なしで生きることができます。

48
Karl Rosaen

@Karl Rosaenの開発

parser = argparse.ArgumentParser()
optional = parser._action_groups.pop() # Edited this line
required = parser.add_argument_group('required arguments')
# remove this line: optional = parser...
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
parser._action_groups.append(optional) # added this line
return parser.parse_args()

そしてこの出力:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
           [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

optional arguments:
  -h, --help                    show this help message and exit
  --optional_arg OPTIONAL_ARG
28
RalphyZ

もう一度、@ RalphyZから構築

これは、公開されているAPIを破壊しません。

from argparse import ArgumentParser, SUPPRESS
# Disable default help
parser = ArgumentParser(add_help=False)
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')

# Add back help 
optional.add_argument(
    '-h',
    '--help',
    action='help',
    default=SUPPRESS,
    help='show this help message and exit'
)
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')

上記と同じように表示され、将来のバージョンでも存続します。

usage: main.py [-h] [--required_arg REQUIRED_ARG]
           [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

optional arguments:
  -h, --help                    show this help message and exit
  --optional_arg OPTIONAL_ARG
1
Bryan_D