Python argparser与多个组中的相同参数互斥

时间:2017-12-06 08:37:54

标签: python argparse

我使用argparser作为通用方式在多个不同文件上提供输入,这些文件用于生成json,并发送到数据库。 话虽如此,我想使用多个互斥的组,并选择将标志作为多个不同组的一部分(如下例所示)。

parser = argparser.argumentParser

group1 = parser.add_mutually_exclusive_group()
group2 = parser.add_mutually_exclusive_group(required=True)
group3 = parser.add_mutually_exclusive_group()

group1.add_argument('-a', type=int) 
group1.add_argument('-d', type=int)

group2.add_argument('-z', type=int)
group2.add_argument('-x', type=int)

group3.add_argument('-a', type=int)
group3.add_argument('-z', type=int)

这意味着-d和-z可以一起使用(但是-z或-x是必需的),让我可以选择-a -d -x OR -z -d

由于某种原因,argparser认为-a或-z标志中的每一个都是冲突的,所以我将conflict_handler添加到'resolve',但似乎没有效果

2 个答案:

答案 0 :(得分:2)

当您向group添加参数时,它也会添加到parserargument_groupmutually_exclusive_group组都是定义某些特殊操作的方法(在帮助和测试中),但它们不会更改基本的解析。

因此,您尝试通过group3定义的参数与已通过其他组定义的参数冲突。我还应该注意add_argument创建一个参数Action对象。

对于错误/问题,我想出了一种将现有操作添加到新组的方法。也就是说,可以将之前创建的-a-z添加到group3。实际上我把它写成一种定义具有现有Actions列表的组的方式。这不是很难做到的。但是显示这样一个组需要对usage格式化程序进行重大改写。

https://bugs.python.org/issue10984

mutually_exclusive_group会做两件事 - 它会修改usage - 如果可能的话。它进行了“互相排斥”的测试。否则它不会修改解析。您可以在解析后执行相同的测试。

在您的示例中,所有参数的默认值均为None。所以在解析之后,你可以这样做:

if args.a is not None and args.z is not None:
   parse.error('cannot use both -a and -z')

在错误/问题中,我修改了add_mutually_exclusive_group以有效地执行:

group1 = parser.add_mutually_exclusive_group()
group2 = parser.add_mutually_exclusive_group(required=True)

a1 = group1.add_argument('-a', type=int) # hang onto the newly created Action
group1.add_argument('-d', type=int)

a2 = group2.add_argument('-z', type=int)
group2.add_argument('-x', type=int)

group3 = parser.add_mutually_exclusive_group()
group3._group_actions.append(a1)      # add existing Action to group
group3._group_actions.append(a2)
#group3.add_argument('-a', type=int)
#group3.add_argument('-z', type=int)

即,指向现有Actions的指针会直接添加到新组,而不会通过add_argument

测试group3

2347:~/mypy$ python3 stack47670008.py -z 3 -a3
usage: stack47670008.py [-h] [-a A | -d D] (-z Z | -x X)
stack47670008.py: error: argument -a: not allowed with argument -z

2347:~/mypy$ python3 stack47670008.py -z 3 -d3
Namespace(a=None, d=3, x=None, z=3)

2347:~/mypy$ python3 stack47670008.py -h
usage: stack47670008.py [-h] [-a A | -d D] (-z Z | -x X)

optional arguments:
  -h, --help  show this help message and exit
  -a A
  -d D
  -z Z
  -x X

group1group2显示在使用情况中,但不显示group3

答案 1 :(得分:0)

我认为你要找的是argparse的sub_parsers选项。 请检查python docs add_subparsers中的链接。