Argparse 位置参数和可选参数顺序错误

8 投票
2 回答
2009 浏览
提问于 2025-04-16 16:48

为什么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

那么,怎么才能让这个工作并且帮助文本保持一致呢?

这里有一个完整的测试程序

2 个回答

4

nargs='+' 是告诉 argparse 把所有剩下的参数都收集在一起,所以 bar 也会被包含进去。它并没有什么神奇的办法来猜测你想让 bar 成为一个独立的有意义的参数,而不是 --foo 的一部分。

文档中的例子提到的是一个简单的 --foo 参数,而不是带有 nargs='+' 的那种。一定要理解这两者之间的区别。

3

你可以试着使用 --input 和 --output 这两个选项,并把这些选项的设置改为必填的,也就是在 add_argument 里加上 required=True。

http://docs.python.org/dev/library/argparse.html#the-add-argument-method

撰写回答