metavar
可以是元组,例如
In [26]: parser = argparse.ArgumentParser()
In [27]: a=parser.add_argument('--integers', metavar=('N1','N2'), type=int, nargs='+')
In [28]: parser.print_help()
usage: ipython3 [-h] [--integers N1 [N2 ...]]
optional arguments:
-h, --help show this help message and exit
--integers N1 [N2 ...]
但这仅适用于可选参数(标记参数),而不是位置参数。虽然我可能之前已经研究过这个问题,但我并不确定原因。
https://docs.python.org/3/library/argparse.html#metavar
使用定位,错误堆栈包括:
/usr/lib/python3.5/argparse.py in _format_action_invocation(self, action)
542 if not action.option_strings:
543 default = self._get_default_metavar_for_positional(action)
--> 544 metavar, = self._metavar_formatter(action, default)(1)
545 return metavar
546
一个位置参数没有选项字符串(或为空),因此它使用“metavar,=…”拆包惯用语来只请求一个字符串。因此出现了错误:“ValueError: too many values to unpack (expected 1)”。所以只期望一个metavar变量是有意的,但我不确定其合理性。也许是因为在usage中更难区分一个位置参数何时结束和另一个开始:
In [34]: parser = argparse.ArgumentParser()
In [35]: parser.add_argument('foo', type=int, nargs=2)
In [36]: parser.add_argument('bar', type=int, nargs='+')
In [38]: parser.print_usage()
usage: ipython3 [-h] foo foo bar [bar ...]
我几年前就看过这个问题,https://bugs.python.org/issue14074。看起来在使用、帮助信息和错误消息方面可能会出现问题。
实际上问题不在于使用
,而在于格式化帮助行:
In [39]: parser = argparse.ArgumentParser()
In [40]: a=parser.add_argument('integers', metavar=('N1','N2'), type=int, nargs='+')
In [41]: parser.print_usage()
usage: ipython3 [-h] N1 [N2 ...]
普通的定位帮助行只显示一个符号,而不是使用方式中的N [N ...]
。
In [43]: parser.print_help()
usage: ipython3 [-h] N [N ...]
positional arguments:
N