正在解析 Python 中的独占组
Parsing exclusive groups in Python
我有 2 个排他性组,您可以定义 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 and -AA or -BB]
或 [-AA and -BB]
已定义但仍必须使用 [-a
and/or -b
],则代码必须终止,
问题是它没有终止...
我找到了这个 thread 并将我的代码编辑为
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: 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()
冒着重复我之前问题的回答的风险,让我们专注于你的案例
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")
尽管名称相似(并且 class 嵌套),argument_groups 和 mutually_exclusive_groups 的功能却大不相同。并且前者没有有意义地嵌套在第二个中。
参数组是在帮助中组织参数的工具。它不会将参数 'as a group' 输入到另一组,并且对解析或错误检查没有影响。
如果确实如您所愿,usage
行会是什么样子?
使用子解析器公式,解析器响应:
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' 字符串告诉它 - 使用“-a -b ...”参数组解析字符串的重置。它必须知道您希望它使用哪个组。
如果不使用我前段时间开发的 bug/issue 补丁,您需要在解析后进行自己的 'mutually-exclusive' 测试。只要你使用默认的defaultNone
,就很容易测试一个argument是已经被使用还是现在(args.AA is not None
).
是最近进行 post-解析测试的例子。
我有 2 个排他性组,您可以定义 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 and -AA or -BB]
或 [-AA and -BB]
已定义但仍必须使用 [-a
and/or -b
],则代码必须终止,
问题是它没有终止...
我找到了这个 thread 并将我的代码编辑为
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: 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()
冒着重复我之前问题的回答的风险,让我们专注于你的案例
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")
尽管名称相似(并且 class 嵌套),argument_groups 和 mutually_exclusive_groups 的功能却大不相同。并且前者没有有意义地嵌套在第二个中。
参数组是在帮助中组织参数的工具。它不会将参数 'as a group' 输入到另一组,并且对解析或错误检查没有影响。
如果确实如您所愿,usage
行会是什么样子?
使用子解析器公式,解析器响应:
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' 字符串告诉它 - 使用“-a -b ...”参数组解析字符串的重置。它必须知道您希望它使用哪个组。
如果不使用我前段时间开发的 bug/issue 补丁,您需要在解析后进行自己的 'mutually-exclusive' 测试。只要你使用默认的defaultNone
,就很容易测试一个argument是已经被使用还是现在(args.AA is not None
).
是最近进行 post-解析测试的例子。