12

我想让解析器像cmd [-a xxx -b xxx] -c xxx -d xxx

什么时候-a用,我也想-b用。同样,如果-b使用,也-a必须使用。两者都可以-a-b不使用。

我怎么做?我尝试过自定义操作,但效果不佳。

4

2 回答 2

14

更好的设计是有一个带有两个参数的选项:

parser.add_argument('-a', nargs=2)

然后,您要么指定带有 2 个参数的选项,要么根本不指定它。

$ script -a 1 2

或者

$ script

自定义操作(或后处理)可以将元组拆分args.a为两个单独的值args.aargs.b.

于 2013-06-06T17:35:58.993 回答
13

Argparse 本身并不支持这种类型的使用。

最有效的做法是检查并查看解析后是否满足这些类型的条件:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-b')
parser.add_argument('-c')

args = parser.parse_args()

required_together = ('b','c')

# args.b will be None if b is not provided
if not all([getattr(args,x) for x in required_together]):
    raise RuntimeError("Cannot supply -c without -b")
于 2013-06-06T16:56:33.743 回答