我正在使用python2.7
和argparse
作为我的脚本。我正在执行脚本如下:
python2.7 script.py -a valuefora -b valueforb -c valueforc -d valueford
现在我想要的是,
如果提供了选项-a
,则只应询问-b
,-c
,-d
个选项。
除了上述内容之外,我还希望将此群组-a -b -c -d
设为-e
的 EITHER OR ,即([-a -b -c -d] | -e )
如果我错了,请纠正我。
答案 0 :(得分:3)
您最好的选择是在parse_args
之后测试是否存在各种组合,并使用parser.error
发出argparse
兼容的错误消息。并编写自己的usage
行。并确保默认值清楚地表明是否已解析选项。
如果您可以将-a
和-e
选项更改为cmda
或build
等命令名称,则可以使用子分析符。在这种情况下,您可以定义一个接受-b,-c和-d的command_a
子分析程序,以及另一个不具有这些子分析程序的command_e
子分析程序。这是关闭argparse
来到'一起需要'的参数组。
mutually exclusive groups
可以使用类似[-a -b -c]
的用法定义某些内容,但这只是-b
和-a
一起发生的-c
。但是这种机制并没有什么特别之处。它只是构造了这种排除的字典,并在每次解析新选项时进行检查。如果存在冲突,则会发出错误消息并退出。它未设置为处理花哨的组合,例如(-e | agroup)
。
自定义操作还可以检查namespace
中是否存在非默认值,就像解析后一样。但在解析过程中这样做并不简单。它引发了关于秩序的问题。您是否希望以与-b -c -a
相同的方式处理-a -c -b
? -a
应该检查其他人是否存在,或者-b
应该检查-a
是否已被解析?谁检查是否存在-e
。
关于argparse组的其他一些堆栈问题,排他性和包容性,但我认为这些是必不可少的问题。