您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

:没关系。因为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 2022/1/1 18:37:28 有270人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶