nargs > 1 的位置参数的元组元变量值

Krz*_*iak 5 python argparse python-3.x

似乎将元组设置为metavar位置参数并请求帮助不起作用:

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('size', type=int, nargs=2, help='size', metavar=('w', 'h'))

args = parser.parse_args()
print(args)
Run Code Online (Sandbox Code Playgroud)

当调用 as 时,这会产生错误prog.py --help。该错误在 Python3 版本之间有所不同(我尝试了 3.5、3.6、3.8)并且包含ValueError: too many values to unpack (expected 1)TypeError: sequence item 0: expected str instance, tuple found请参阅 Wandbox 上的实例

对于可选参数,一切都很好:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--size', type=int, nargs=2, help='size', metavar=('w', 'h'))

args = parser.parse_args()
print(args)
Run Code Online (Sandbox Code Playgroud)

Wandbox 上的实例

我的代码是否无效,或者我是否在 Python 实现中发现了错误?

请注意,简单地解析参数就可以按预期工作。

hpa*_*ulj 2

回溯的最后一部分是

/usr/lib/python3.6/argparse.py in _format_action_invocation(self, action)
    550         if not action.option_strings:
    551             default = self._get_default_metavar_for_positional(action)
--> 552             metavar, = self._metavar_formatter(action, default)(1)
    553             return metavar
    554 
Run Code Online (Sandbox Code Playgroud)

所以是的,它特别发生在positionals(empty option_strings) 上。该metavar, = ...分配仅适用于 RHS 返回一项。你的metavar它返回 2。

使用情况显示正常

In [36]: parser.print_usage()                                                   
usage: ipython3 [-h] w h
Run Code Online (Sandbox Code Playgroud)

它看起来确实像一个错误。

参数(1)告诉函数应该返回一个 1 元素元组:

metavar, = self._metavar_formatter(action, default)(1)
Run Code Online (Sandbox Code Playgroud)

我怀疑这个问题已经在 Python bug/issues 中提出了。我稍后再找找。


除了元变量之外,您还可以使用两个位置参数:

parser = argparse.ArgumentParser()
parser.add_argument('w', type=int)
parser.add_argument('h', type=int)
Run Code Online (Sandbox Code Playgroud)

这长期以来一直是一个已知的错误 - 但到目前为止还没有采取任何行动:

https://bugs.python.org/issue14074

argparse 允许 nargs>1 作为位置参数,但不允许 metavar 为元组