argparse:如何仅将组选项作为组进行操作

时间:2013-12-01 10:36:09

标签: python python-2.7 argparse command-line-parsing

我正在使用python2.7argparse作为我的脚本。我正在执行脚本如下:

  

python2.7 script.py -a valuefora -b valueforb -c valueforc -d valueford

现在我想要的是,

  1. 如果提供了选项-a,则只应询问-b-c-d个选项。

  2. 除了上述内容之外,我还希望将此群组-a -b -c -d设为-e EITHER OR ,即([-a -b -c -d] | -e )

  3. 如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:3)

您最好的选择是在parse_args之后测试是否存在各种组合,并使用parser.error发出argparse兼容的错误消息。并编写自己的usage行。并确保默认值清楚地表明是否已解析选项。

如果您可以将-a-e选项更改为cmdabuild等命令名称,则可以使用子分析符。在这种情况下,您可以定义一个接受-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组的其他一些堆栈问题,排他性和包容性,但我认为这些是必不可少的问题。