3

我正在尝试制作一个使用如下的脚本:

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

即脚本要么采用参数-p参数。如果同时指定和,则为错误。我尝试了以下但似乎不起作用-l -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
4

1 回答 1

0

我认为您在滥用互斥组。组与其他组不互斥,组的成员彼此互斥。另外,据我从文档中可以看出,标准组不会影响解析逻辑,它们仅有助于组织解析器生成的帮助消息。

以下是您如何做出两个选项,-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)
于 2013-10-22T00:11:37.700 回答