14

argparseパッケージでは、パラメーターmetavarはプログラムの表示されたヘルプメッセージを変更します。次のプログラムは動作することを意図したものではなく、単にパラメータの動作を示すために使用されていmetavarます。

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = "Print a range.")

    parser.add_argument("-range1", nargs = 3, type = int, help = "Specify range with: start, stop, step.", metavar = ("start", "stop", "step"))
    parser.add_argument("-range2", nargs = 3, type = int, help = "Specify range with: start, stop, step.", metavar = "r2")

対応するヘルプメッセージは次のとおりです。

usage: main.py [-h] [-range1 start stop step] [-range2 r2 r2 r2]

Print a range.

optional arguments:
  -h, --help            show this help message and exit
  -range1 start stop step
                        Specify range with: start, stop, step.
  -range2 r2 r2 r2      Specify range with: start, stop, step.

-range1との違いに注意してください-range2。明らか-range1に、ヘルプメッセージの推奨される方法です。

この時点まで、すべてが私には明らかです。ただし、オプションの-range1引数を位置range1引数に変更すると、argparsemetavarはパラメーター( )のタプルを処理できませんValueError: too many values to unpack
私がそれを機能させることができた唯一の方法は、それ-range2が行われる方法でした。しかし、ヘルプメッセージは、この場合ほど良くはありません-range1

ケースと同じヘルプメッセージを取得する方法はあります-range1が、オプションではなく位置引数を取得する方法はありますか?

4

2 に答える 2

7

どうですか:

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = "Print a range.")

    parser.add_argument("start", type = int, help = "Specify start.", )
    parser.add_argument("stop", type = int, help = "Specify stop.", )
    parser.add_argument("step", type = int, help = "Specify step.", )

    args=parser.parse_args()
    print(args)

これは

% test.py -h
usage: test.py [-h] start stop step

Print a range.

positional arguments:
  start       Specify start.
  stop        Specify stop.
  step        Specify step.

optional arguments:
  -h, --help  show this help message and exit
于 2011-10-31T13:39:37.307 に答える
5

ただし、オプションの-range1引数をpositional range1引数に変更すると、argparseはmetavarパラメーターのタプルを処理できません(ValueError:値が多すぎて解凍できません)。

too many values to unpackargparseはそのエラーメッセージを表示するべきではありません。によって生成されmetavar, = self._metavar_formatter(action, default)(1)ます。通常、この関数は単一のアイテムリストまたはタプルを生成しますが、この場合はタプルメタ変数を返します。より有益なエラーメッセージ(tuple metavar not allowed with positionals?)を表示するか、metavar(start|stop|step?)を適切に適合させる必要があります。もう1つのオプションは、タプルの代わりにヘルプ行でデフォルトのメタ変数を使用することです。

タプルmetavarは、使用ラインで問題なく機能します。

ヘルプのフォーマットは、均一な位置を念頭に置いて書かれていると思います。使用ラインには表示されるX [X [X ...]]場合がありますが、ヘルプラインには表示されX ... description of Xます。

あなたの3つのアイテムは異なる名前を持っているので、unutbuが3つの別々の位置を提案することは、おそらくargparseの設計者が念頭に置いていたものです。

この問題は発生しました(ただし、パッチは適用されていません)

http://bugs.python.org/issue14074 "argparseは、位置引数にnargs> 1を許可しますが、metavarをタプルにすることはできません。"

于 2013-07-26T16:07:05.743 に答える