gpt4 book ai didi

python - argparse (python) 是否支持互斥的参数组?

转载 作者:IT老高 更新时间:2023-10-28 20:42:03 30 4
gpt4 key购买 nike

如果我有参数 '-a', '-b', '-c', '-d' , 与 add_mutually_exclusive_group()函数我的程序将只需要使用其中一个。有没有办法将它结合起来,以便程序只接受 '-a 999 -b 999''-c 999 -d 999' ?

编辑:添加一个简单的程序更清晰:

>>> parser = argparse.ArgumentParser()
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('-a')
>>> group.add_argument('-b')
>>> group.add_argument('-c')
>>> group.add_argument('-d')

那么只有 ./app.py -a | ./app.py -b | ./app.py -c | ./app.py -d可以调用。是否可以将 argparse 分组排除组,以便只有 ./app.py -a .. -b .. | ./app.py -c .. -d ..被召唤?

最佳答案

编辑:没关系。因为 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])

关于python - argparse (python) 是否支持互斥的参数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4770576/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com