Python argparse:具有一些兼容参数的互斥组

Kev*_*rke 15 python argparse

我想在argparse中实现这样的逻辑:

If argument A is selected, the user cannot select arguments B or C.
B and C can both be selected
Run Code Online (Sandbox Code Playgroud)

它看起来就像add_mutually_exclusive_group我想要的那样,但看起来你只能从一个互斥的组中选择一个选项,所以我不能将所有三个选项放在一个互斥的组中.

有没有办法在argparse中执行此操作?

Oz1*_*123 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)
Run Code Online (Sandbox Code Playgroud)

我在这里使用命令行包装器的选项来查询 mongodb。该collection实例可以调用该方法aggregate或方法find一起可选参数queryfields,因此你看到为什么前两个参数是兼容的,最后一个是没有的。

所以现在我运行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)
Run Code Online (Sandbox Code Playgroud)

当然,这个小技巧只适用于简单的情况,如果您有许多互斥的选项和组,检查所有可能的选项将成为一场噩梦。在这种情况下,您应该将选项分解为命令组。为此,您应该遵循Python argparse 互斥组此处的建议。


jar*_*ary -1

您可以否定 A 的含义,然后使用子解析器。子解析器允许您指定“当且仅当选择 A 时,用户才能选择 B 或 C”。

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

  • 如果没有例子,这是一个非常糟糕的答案。 (4认同)