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)
我的代码是否无效,或者我是否在 Python 实现中发现了错误?
请注意,简单地解析参数就可以按预期工作。
回溯的最后一部分是
/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 为元组