Argparse参数位置和可选参数顺序不正确。

8
为什么argparse无法解析这些参数?
--foo 1 2 3 bar

使用
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='+')                  
parser.add_argument('bar')

出现以下错误:

错误:参数过少

但是如果我先传递 bar 参数,它就可以正常工作:

bar --foo 1 2 3   

现在,这本身并不太糟糕。我可以接受将位置参数放在第一位,只是这种行为与argparse为我们创建的帮助不一致,它声明bar应该是最后一个参数:

使用: argparsetest.py [-h] [--foo FOO [FOO ...]] bar

那么如何使帮助文本保持一致呢?
这里有一个完整的测试程序

1
刚刚遇到了同样的问题。可以使用--来结束nargs通配符,所以在你上面的例子中,--foo 1 2 3 -- bar应该可以工作。在我看来,它真的应该自动解决,为位置参数保留所需的参数数量。关于这个问题,有讨论在http://bugs.python.org/issue9338和http://bugs.python.org/issue9182(至少应该清楚地记录下来)。 - Daniel Andersson
-- 停止列表如此酷炫,这是我最喜欢的答案。 - Ulf Gjerdingen
2个回答

4

nargs='+'表示argparse将收集所有剩余的参数,因此bar也被包含在内。它没有神奇的方法来猜测您打算让bar成为一个有意义的单独参数,而不是--foo所取的参数的一部分。

文档中的示例是指一个简单的--foo参数,而不是一个带有nargs='+'的参数。请确保理解两者之间的区别。


2
很容易实现将最后n个参数视为n个强制位置参数。这不是魔法,我猜只是一个设计决策。 - Reimund

3

谢谢,这很有效并为我提供了一致的帮助文本。唯一的缺点是额外的--input标志部分,但我可以接受。干杯 - Reimund
为了澄清事情,建议的解决方案是使用parser.add_argument('--bar', required=True)。然后可以传递以下参数:--foo 1 2 3 --bar bar。 - Reimund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接