为什么 argparse 顺序与可选参数有关?

Why does argparse order matter with an optional argument?

我有一些代码可以解析名为 "blah.py":

的文件中的一些参数
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('opt', nargs='?')
parser.add_argument('--bool', action='store_true')
parser.add_argument('value')

args = parser.parse_args()

如果我这样调用这个文件:

blah.py a b --bool

它工作正常(opt='a',value='b',bool=True)。

但是,如果我以不同的顺序调用它:

blah.py a --bool b

我希望得到相同的结果,但 argparse 模块正在打印 error: unrecognized arguments: b 消息。这是 argparse 模块的错误吗?为什么它会以这种方式工作,在为我的脚本定义 CLI 时,我可以做些什么来避免 运行 出现此类问题?

由于我的界面比示例复杂得多(具有子命令和更多参数),我有多种调用界面的方法,这需要一些参数对于某些调用是可选的,但对于其他调用是强制性的。我计划手动验证这些情况,并在出错时调用 parser.print_usage 并退出。

您可能想查看 argparser

的 "intermixed" 选项

https://docs.python.org/3/library/argparse.html#intermixed-parsing

否则,位置参数总是在可​​选参数之前。