nargs> 1的位置参数的元组metavar值

时间:2019-10-24 12:31:04

标签: python python-3.x argparse

将元组设置为$finalArray=[]; for($i=0;$i<count($lnk);$i++){ $finalArray[] = ['url'=>$lnk[$i]['url'], 'img'=>$img[$i]['img']]; } 作为位置参数并请求帮助似乎无效:

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) 时会产生错误。错误在Python3版本(我尝试过3.5、3.6、3.8)之间有所不同,并且包含prog.py --helpValueError: too many values to unpack (expected 1)See live example on Wandbox

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

TypeError: sequence item 0: expected str instance, tuple found

Live example on Wandbox

我的代码无效还是在Python实现中发现了错误?

请注意,仅解析参数即可按预期工作。

2 个答案:

答案 0 :(得分:1)

回溯的最后一部分是

/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 

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

用法显示正常

In [36]: parser.print_usage()                                                   
usage: ipython3 [-h] w h

它看起来确实像个错误。

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

metavar, = self._metavar_formatter(action, default)(1)

我怀疑此问题已在Python错误/问题中提出。我待会儿找到。


您也可以使用两个位置参数来代替metavar:

parser = argparse.ArgumentParser()
parser.add_argument('w', type=int)
parser.add_argument('h', type=int)

很长一段时间以来,这是一个已知的错误-但到目前为止没有采取任何行动:

https://bugs.python.org/issue14074

  

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

答案 1 :(得分:1)

hpaulj's answer之后,这是使用action='append'的另一种解决方法:

for name in 'width', 'height':
    parser.add_argument('size', type=int, help=name, metavar=name[0], action='append')
args = parser.parse_args(['4', '3'])
print(args)
parser.print_help()

输出:

Namespace(size=[4, 3])
usage: test.py [-h] w h

positional arguments:
  w           width
  h           height