argparsemutual_exclusive_group 与子组

bal*_*lki 5 python argparse

我正在尝试制作一个脚本,其用法如下:

my_script [-p parg -l larg] | [-s sarg]
Run Code Online (Sandbox Code Playgroud)

即脚本要么采用-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
Run Code Online (Sandbox Code Playgroud)

Bi *_*ico 1

我认为你滥用了相互排斥的群体。组与其他组并不互斥,组的成员之间却是互斥的。另外,据我从文档中可以看出标准组不会影响解析逻辑,它们仅有助于组织解析器生成的帮助消息。

以下是如何做出两个选项,-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"])
Run Code Online (Sandbox Code Playgroud)

但我不确定此功能是否允许您实现您的用例,因为我不确定参数是否可以属于两个互斥的组。但是,您始终可以自己进行错误检查,并使用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)
Run Code Online (Sandbox Code Playgroud)