【发布时间】:2020-03-04 09:39:35
【问题描述】:
我正在尝试配置argparse,以便只有以下参数组合有效:
--flagA --argument1 val1 --argument2 val2 --argument3 val3
--flagB --argument1 val1
到目前为止,我已经编写了以下代码,但它并不能解决问题,因为 --argument2 和 --argument3 都是可选的:
required_args = arg_parser.add_argument_group()
required_args.add_argument('--argument1', required=True)
# Optional arguments
optional_args = arg_parser.add_argument_group()
optional_args.add_argument('--argument2', required=False)
optional_args.add_argument('--argument3', required=False)
# Flags
flag_group = arg_parser.add_mutually_exclusive_group(required=True)
flag_group.add_argument('--flagA', dest='flag', action='store_const', const="flagA")
flag_group.add_argument('--flagB', dest='flag', action='store_const', const="flagB")
args = vars(arg_parser.parse_args())
使用此设置,--flagA --argument1 val1 也是,但它不应该是。
我知道我可以处理调用.parse_args() 后生成的Namespace,并检查在传递--flagA 时是否提供了--argument2 和--argument3,但是我正在寻找一种更自然的方法来实现这一点。
基本上,定义应如下所示:
[-h] --argument1 ARGUMENT1 (--flagA --argument2 ARGUMENT2 --argument3 ARGUMENT3 | --flagB)
【问题讨论】:
-
互斥组是
argparse中唯一的同现工具。这是一个简单的xor。如果这对您不起作用,请使用解析后测试。尝试将argparse用于所有事情并不是什么“自然”的事情。