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参数,则argparse无法处理metavar参数 ( 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 参数更改为位置 range1 参数,则 argparse 无法处理 metavar 参数的元组(ValueError:要解包的值太多)。

argparse 不应该给出那个too many values to unpack错误信息。它由metavar, = self._metavar_formatter(action, default)(1). 通常,此函数会生成单个项目列表或元组,但在您的情况下,它会返回元组元变量。它需要提供更多信息的错误消息(tuple metavar not allowed with positionals?),或优雅地调整元变量(start|stop|step?)。另一种选择是在帮助行中使用默认元变量而不是元组。

元组元变量在使用行上工作正常。

我认为帮助格式是在考虑统一位置的情况下编写的。它可能会显示在使用行上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 回答