我想在 argparse 中实现这样的逻辑:
If argument A is selected, the user cannot select arguments B or C.
B and C can both be selected
看起来这add_mutually_exclusive_group
是我想要的,但看起来你只能从互斥组中选择一个选项,所以我不能将这三个选项都放在互斥组中。
有没有办法在 argparse 中做到这一点?
我想在 argparse 中实现这样的逻辑:
If argument A is selected, the user cannot select arguments B or C.
B and C can both be selected
看起来这add_mutually_exclusive_group
是我想要的,但看起来你只能从互斥组中选择一个选项,所以我不能将这三个选项都放在互斥组中。
有没有办法在 argparse 中做到这一点?
你不能真正做到这一点argparse
,但是你可以在argparse
运行后做到这一点。
这是一个例子:
parser = argparse.ArgumentParser()
# group 1
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)
# group 2
parser.add_argument("-a", "--aggregation", help="aggregation",
required=False)
我在这里使用为命令行包装器提供的选项来查询 mongodb。collection
实例可以调用方法aggregate
或find
带有可选参数query
and的方法fields
,因此您会看到为什么前两个参数兼容而最后一个参数不兼容。
所以现在我运行parser.parse_args()
并检查它的内容:
args = parser().parse_args()
print args.aggregation
if args.aggregation and (args.query or args.fields):
print "-a and -q|-f are mutually exclusive ..."
sys.exit(2)
当然,这个小技巧只适用于简单的情况,如果您有许多互斥的选项和组,检查所有可能的选项将成为一场噩梦。在这种情况下,您应该将您的选项分解为命令组。为此,您应该遵循Python argparse 互斥组的建议。
您可以否定 A 的含义,然后使用子解析器。The subparsers allows you to specify that "If and only if A is selected, user can select B or C."