为什么 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
否则,位置参数总是在可选参数之前。
我有一些代码可以解析名为 "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
否则,位置参数总是在可选参数之前。