argparse是否支持多个独占参数?

时间:2015-04-28 14:06:23

标签: python argparse

假设我有两组参数。您可以使用每个组中的任意数量的参数,但不能在组之间混合参数。

有没有办法在argparse模块中自定义冲突的参数?我尝试过使用方法add_mutually_exclusive_group,但这不是我想要的。

1 个答案:

答案 0 :(得分:3)

我已经提出了一个补丁(或者说补丁),可以让你测试参数的一般逻辑组合。 http://bugs.python.org/issue11588

我的想法的核心是在parse_args内添加一个钩子,让用户测试参数的所有逻辑组合。在那一点上,它可以访问列表seen参数。在parse_args之外,您无法使用此列表(因此需要挂钩)。但是使用适当的defaults,您可以编写自己的使用args命名空间的测试。

实施通用argparse版本的困难包括:

a)实施某种嵌套组(在您的情况下,嵌套在any组内的多个xor组)

b)在有意义的usage

中显示这些群组

现在你最好的选择是实现subparsers的问题(如果适合),或者在解析后进行自己的测试。并编写自己的usage

这是一个可以在解析后应用于args命名空间的可推广测试的草图

def present(a):
    # test whether an argument is 'present' or not
    # simple case, just check whether it is the default None or not
    if a is not None:
        return True
    else:
        return False

# sample namespace from parser
args = argparse.Namespace(x1='one',x2=None,y1=None,y2=3)

# a nested list defining the argument groups that need to be tested
groups=[[args.x1,args.x2],[args.y1,args.y2]]

# a test that applies 'any' test to the inner group
# and returns the number of groups that are 'present'
[any(present(a) for a in g) for g in groups].count(True)

如果count为0,则找不到任何组,如果1找到了一个组,等等。我在错误问题中提到的hook执行相同的操作测试,只使用不同的present测试。

如果计数mutually exclusive,正常的>1测试会反对。必需的组会反对0等。您也可以执行类似

的操作
if (present(args.x1) or present(args.x2)) and 
   (present(args.y1) or present(args.y2)): 
   parser.error('too many groups')

即。 anyallandor的某种组合。但count是处理xor条件的好方法。