argparse mutual_exclusive_group与子组

时间:2013-10-21 23:27:08

标签: python argparse

我正在尝试使用如下脚本编写脚本:

my_script [-p parg -l larg] | [-s sarg]

即脚本要么采用-p-l参数 OR -s参数。如果同时指定-p-s,则会出错。我尝试了以下但似乎没有工作

import argparse
parser = argparse.ArgumentParser(description='Some Desc')
gp = parser.add_mutually_exclusive_group()
num_gp = gp.add_argument_group()
num_gp.add_argument('-p')
num_gp.add_argument('-l')
gp.add_argument('-s')
In [18]: parser.parse_args(['-p blahp', '-l blahl', '-s blahs'])
Out[18]: Namespace(l=' blahl', p=' blahp', s=' blahs') #ERROR Should have failed as I specify both `-p` and `-s` which belong to a mutually_exclusive_group

1 个答案:

答案 0 :(得分:0)

我认为你滥用互斥的群体。组不与其他组互斥,组的成员彼此互斥。另外,据我所知docs,标准组不会影响解析逻辑,它们只能帮助组织解析器生成的帮助消息。

以下是如何制作两个选项,例如-p-s互斥:

import argparse

parser = argparse.ArgumentParser(description='Some Desc')
group1 = parser.add_mutually_exclusive_group()
group1.add_argument("-p")
group1.add_argument("-s")

# This works
args = parser.parse_args(["-p", "argForP"])
# This will throw an error
args = parser.parse_args(["-p", "argForP", "-s", "argForS"])

但我不确定此功能是否允许您实现您的用例,因为我不确定参数是否属于两个互斥组。但是,您始终可以自行进行错误检查,并使用parser.error。这看起来像这样:

message = "invalid options"

# Tells us p is used without l or vise versa
if (args.p is None) != (args.l is None):
    parser.error(message)

# Tells is if p-l is used with s
if (args.p is None) == (args.s is None):
    # Either both are used or neigher
    parser.error(message)