在 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
案例相同的帮助消息,但是对于位置参数而不是可选的?
答案 0 :(得分: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
答案 1 :(得分: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而不是元组。
元组元变量在使用行上正常工作。
我认为帮助格式是在考虑统一定位的情况下编写的。在使用行中,它可能会显示X [X [X ...]]
,但在帮助热线上只显示X ... description of X
。
你的3个项目有不同的名字,所以unutbu建议3个独立的位置可能是argparse设计师的想法。
此问题已提出(但未修补)
http://bugs.python.org/issue14074 “argparse允许使用nargs> 1作为位置参数,但不允许metavar成为元组”