如何在python的argparse中修改位置参数的元变量



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情况相同的帮助消息,但对于位置参数而不是可选的?

如何:

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

但是,如果我将可选的-range1参数更改为位置range1参数,argparse将无法处理元参数的元组(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,但不允许元数据为元组"

最新更新