18

我想在 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 中做到这一点?

4

3 回答 3

5

你不能真正做到这一点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实例可以调用方法aggregatefind带有可选参数queryand的方法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 互斥组的建议。

于 2014-12-28T10:33:22.283 回答
1

Docopt可以在这种情况下工作。

它使用管道来表示互斥的元素。

my_program (aggregate | find [-q | -f])
于 2015-01-04T06:00:43.487 回答
-1

您可以否定 A 的含义,然后使用子解析器。The subparsers allows you to specify that "If and only if A is selected, user can select B or C."

http://docs.python.org/2/library/argparse.html

于 2013-01-05T00:45:23.023 回答