解析Python中的独占组

时间:2015-05-21 11:56:31

标签: python command-line-arguments argparse

我有2个独占的组,您可以定义来自group2group2的参数,但parser = argparse.ArgumentParser() group_exclusive = parser.add_mutually_exclusive_group() sub_exclusive_1 = group_exclusive.add_argument_group() sub_exclusive_1.add_argument("-a") sub_exclusive_1.add_argument("-b") sub_exclusive_1.add_argument("-c") sub_exclusive_1.add_argument("-d") sub_exclusive_2 = group_exclusive.add_mutually_exclusive_group() sub_exclusive_2.add_argument("-AA") sub_exclusive_2.add_argument("-BB") args = parser.parse_args() 也必须在其参数中排除。

[-a and -AA or -BB]

如果已定义[-AA and -BB]-a但仍必须使用[-b和/或subparsers = parser.add_subparsers() parser_a = subparsers.add_parser('command_1') parser_a.add_argument("-a") parser_a.add_argument("-b") parser_a.add_argument("-c") parser_a.add_argument("-d") parser_b = subparsers.add_parser('command_2') parser_b.add_argument("-AA") parser_b.add_argument("-BB") ]

,则必须终止代码

问题在于它没有终止......

我找到了这个thread并将我的代码编辑为

main.py: error: too few arguments

仍无效,追溯:parser = argparse.ArgumentParser() parser.add_argument("-a") ... parser.add_argument("-AA") args = parser.parse_args() if (args.a or args.b or args.c or args.d) and (args.AA or args.BB) or (args.AA and args.BB): raise SystemExit()

我做错了什么?

目前的解决方法:

{{1}}

1 个答案:

答案 0 :(得分:2)

冒着重复我之前问题的答案的风险,让我们关注你的案例

parser = argparse.ArgumentParser()
group_exclusive = parser.add_mutually_exclusive_group()
sub_exclusive_1 = group_exclusive.add_argument_group()
...

sub_exclusive_2 = group_exclusive.add_mutually_exclusive_group()
sub_exclusive_2.add_argument("-AA")
sub_exclusive_2.add_argument("-BB")

尽管名称相似(和类嵌套),但argument_groups和mutual_exclusive_groups的功能却截然不同。前者并没有在第二个中有意义地嵌套。

参数组是一种在帮助中组织参数的工具。它不会作为一个群体输入参数'进入另一个组,对解析或错误检查没有影响。

如果它按照您的意愿行事,那么usage行会是什么样的?

使用subparser公式,解析器响应:

prog command1 -a -b -c  # ok
prog command1 -a -AA    # error - not recognize -AA
prog command2 -AA -BB   # ok
prog command2 -a -AA    # error - -a not recognized
prog -AA                # error - too few arg

subparser机制类似于

parser.add_argument('cmd', choices=['command1','command2']

'命令1' string告诉它 - 使用' -a -b ...'解析字符串的重置。一组论点。它必须知道您希望它使用哪个组。

如果不使用我之前工作的错误/问题补丁,你需要自己做一个互相排斥的'解析后进行测试。只要您使用默认的默认None,就可以轻松测试参数是否已被使用或现在(args.AA is not None)。

https://stackoverflow.com/a/30337890/901925是最近进行解析后测试的一个例子。