如何修改pythons argparse中位置参数的metavar?

Wol*_*tan 13 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")
Run Code Online (Sandbox Code Playgroud)

相应的帮助信息是:

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.
Run Code Online (Sandbox Code Playgroud)

请注意后面的差异-range1-range2.显然-range1是帮助信息的首选方式.

到目前为止,一切都很清楚.但是,如果我将可选-range1参数更改为位置range1参数,则argparse无法处理metavar参数(ValueError: too many values to unpack)的元组.
我能够让它工作的唯一方法-range2是完成方式.但到目前为止,帮助信息并没有那么好-range1.

有没有办法获得与-range1案例相同的帮助消息,但是对于位置参数而不是可选的?

unu*_*tbu 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)
Run Code Online (Sandbox Code Playgroud)

产量

% 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
Run Code Online (Sandbox Code Playgroud)


hpa*_*ulj 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?),或者优雅地调整metavar(start|stop|step?).另一种选择是在帮助行中使用默认的metavar而不是元组.

元组metavar在使用行上正常工作.

我认为帮助格式是在考虑统一定位的情况下编写的.在它可能显示的使用线上X [X [X ...]],但在帮助热线上X ... description of X.

你的3个项目有不同的名字,所以unutbu建议3个独立的位置可能是argparse设计师的想法.

此问题已提出(但未修补)

http://bugs.python.org/issue14074"argparse 允许nargs> 1作为位置参数,但不允许metavar成为元组"