编辑:没关系。因为argparse
在调用group.add_argument
. 那不会是我的设计选择。如果您迫切需要此功能,可以尝试使用ConflictsOptionParser:
# exclusivegroups.py
import conflictsparse
parser = conflictsparse.ConflictsOptionParser()
a_opt = parser.add_option('-a')
b_opt = parser.add_option('-b')
c_opt = parser.add_option('-c')
d_opt = parser.add_option('-d')
import itertools
compatible_opts1 = (a_opt, b_opt)
compatible_opts2 = (c_opt, d_opt)
exclusives = itertools.product(compatible_opts1, compatible_opts2)
for exclusive_grp in exclusives:
parser.register_conflict(exclusive_grp)
opts, args = parser.parse_args()
print "opts: ", opts
print "args: ", args
因此,当我们调用它时,我们可以看到我们得到了想要的效果。
$ python exclusivegroups.py -a 1 -b 2
opts: {'a': '1', 'c': None, 'b': '2', 'd': None}
args: []
$ python exclusivegroups.py -c 3 -d 2
opts: {'a': None, 'c': '3', 'b': None, 'd': '2'}
args: []
$ python exclusivegroups.py -a 1 -b 2 -c 3
Usage: exclusivegroups.py [options]
exclusivegroups.py: error: -b, -c are incompatible options.
警告消息不会通知您两者'-a'
不'-b'
兼容'-c'
,但是可以制作更合适的错误消息。较旧的,错误的答案如下。
较旧的编辑: [此编辑是错误的,尽管如果以argparse
这种方式工作,这不是一个完美的世界吗?]我以前的答案实际上是不正确的,您应该可以通过为argparse
每个互斥选项指定一个组来做到这一点。我们甚至可以用它itertools
来概括这个过程。并使其不必显式地输入所有组合:
import itertools
compatible_opts1 = ('-a', '-b')
compatible_opts2 = ('-c', '-d')
exclusives = itertools.product(compatible_opts1, compatible_opts2)
for exclusive_grp in exclusives:
group = parser.add_mutually_exclusive_group()
group.add_argument(exclusive_grp[0])
group.add_argument(exclusive_grp[1])