Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中解析独占组_Python_Command Line Arguments_Argparse - Fatal编程技术网

在Python中解析独占组

在Python中解析独占组,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我有两个组是独占的,您可以定义group1或group2中的参数,但是group2在其参数中也必须是独占的 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

我有两个组是独占的,您可以定义
group1
group2
中的参数,但是
group2
在其参数中也必须是独占的

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和-AA或-BB]
[-AA和-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")
仍然不起作用,回溯:
main.py:错误:参数太少

我做错了什么

当前解决方法:

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()

冒着重复我先前问题答案的风险,让我们关注一下你的情况

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")
尽管名称(和类嵌套)相似,但参数组和互斥组的功能却截然不同。而前者并不意味着在后者内部筑巢

参数组是在帮助中组织参数的工具。它不会将参数“作为一个组”输入到另一个组中,并且对解析或错误检查没有影响

如果它确实按照您的要求运行,那么
用法
行会是什么样子

使用子parser公式,解析器响应:

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
亚帕斯机制类似于

parser.add_argument('cmd', choices=['command1','command2']
“command1”字符串告诉-parser使用“-a-b…”组参数重置字符串。它必须知道您希望它使用哪个组

除了使用我不久前开发的bug/issue补丁之外,您还需要在解析后进行自己的“互斥”测试。只要使用默认值
None
,就可以很容易地测试某个参数是否已被使用或现在已被使用(
args.AA不是None


是最近进行解析后测试的一个例子。

为什么不在
exclusive_2
中创建另一个互斥组?@n9code要使
-AA
-BB
彼此互斥,只能定义其中一个,那么问题是什么?在第一个代码片段中,您可以执行
sub\u sub\u 2=sub\u exclusive\u 2。添加互斥组()
,然后将
-AA
-BB
添加到该组中。因此,它们必须是排他性的。顺便说一句,您的代码中有一个错误-建议进行编辑。@n9code-thx用于注意该错误,正如我所说,当将
-a
-AA
传递给它时,代码不会终止。。。这是主要问题好的,我明白了。我认为代码必须能够在不指定任何参数的情况下工作,您使用的
-AA
-BB
行不是
ok
,在这种情况下,代码必须终止,我的重点是代码的功能。您可以给
parser_b
一个互斥组。。但对于次parser,您无法使用0个参数。如果您不喜欢subparser选项,那么您可以自己进行解析后测试。这样做有很多好处。我采用了你们链接的解决方案,并决定用我添加到线程中的条件检查参数,这对我的案例有效