【发布时间】:2013-01-17 15:01:15
【问题描述】:
我开始学习 Python,现在我正在学习 argparse 的巨大好处。
使用argparse,我创建了两组参数:group_list 和group_simulate。每个组都有自己的参数——用户只能在每个组中指定一个参数(使用parser.add_mutually_exclusive_group() 实现)。
现在,如果用户从两个 groupgs 而不是只从其中一个中指定参数,我的目标会出现语法错误——我想通过使用argparse 的功能而不是通过编写询问的方法来实现这一点如果 this 和 this 被指定打印语法错误。
import argparse
parser = argparse.ArgumentParser(
description='this is the description',
epilog="This is the epilog",
argument_default=argparse.SUPPRESS
)
parser.add_argument('-v', '--verbose', help='verbose', action='store_true', default=False)
group_list = parser.add_mutually_exclusive_group()
group_list.add_argument('-m', help='list only modules', action='store_const', dest='list', const='modules', default='all')
group_list.add_argument('-p', help='list only ports', action='store_const', dest='list', const='ports', default='all')
group_list.add_argument('--list', help='list only module or ports', choices=['modules','ports'], metavar='<modules/ports>', default='all')
group_simulate = parser.add_mutually_exclusive_group()
group_simulate.add_argument('-M', help='simulate module down', nargs=1, metavar='module_name', dest='simulate')
group_simulate.add_argument('-P', help='simulate FC port down', nargs=1, metavar='fc_port_name', dest='simulate')
group_simulate.add_argument('-I', help='simulate iSCSI port down', nargs=1, metavar='iSCSI_port_name', dest='simulate')
group_simulate.add_argument('--simulate', help='simulate module or port down', nargs=1, dest='simulate')
args = parser.parse_args()
print args
所以说得更具体:
允许:
test.py
output: Namespace(list='all', verbose=False)
test.py -m
output: Namespace(list='modules', verbose=False)
test.py -P asfasf
output: Namespace(P=['asfasf'], list='all', verbose=False)
不允许:
test.py -m -P asfsaf
expected output: <the help message>
test.py -P asfasf -m
expected output: <the help message>
我试图通过argparse 中的add_subparsers 选项实现想要的目标,但没有任何成功。
所以我的问题是如何实现这种情况?
【问题讨论】:
-
将所有互斥的 args 放在一个组中有什么区别?
-
@TheodrosZelleke 使用多个互斥组,例如,您可以将
required参数传递给其中的一些。拥有一个相互排斥的组你不能这样做。另一个优点是,如果使用多个互斥组,帮助消息会提供更多信息。此外,将来可能会提供有关互斥组的更多信息(例如标题和描述),因此它将显示更多信息帮助消息。 -
@Bakuriu -- 但是如果一个组是
required来提供一个参数,那不是立即排除所有其他组吗? -
我同意如果一个参数被定义为
required,这将与add_mutually_exclusive冲突——因为你必须指定这个参数并且不能指定其他论据,我是这样理解的。在上述情况下,我没有使用任何required参数。 -
我不知道为什么这个答案被接受了。 OP 声明您应该能够恰好选择
-m, -p, --list中的 1 个和-M, -P, -I, --simulate中的 1 个。这个答案没有这样做。