我知道将多个位置参数组合成一个互斥的组是没有意义的,因为你不能说谁是谁。但我需要在其中包含一个位置参数。
我需要什么:
$ myprogram -h
usage: myprogram [-h] [--delete value | --update value | value]
位置value
是默认操作(类型为“--include”)。 (myprogram
没有参数也必须有效。)
我的第一次尝试(这不起作用):
parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--delete', metavar='value')
group.add_argument('--update', metavar='value')
group.add_argument('value')
这可能吗?
第二次尝试:
parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--delete', action='store_true')
group.add_argument('--update', action='store_true')
group.add_argument('--insert', action='store_true', default=True)
group.add_argument('value')
答案 0 :(得分:10)
我的做法有点不同:
parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.set_defaults(mode='insert')
group.add_argument('--delete', action='store_const', dest='mode', const='delete')
group.add_argument('--update', action='store_const', dest='mode', const='update')
group.add_argument('--insert', action='store_const', dest='mode', const='insert')
parser.add_argument('value', nargs='?')
args = parser.parse_args()
如果您还想让program --delete
(没有value
选项)失败,请添加
if args.mode != 'insert' and args.value:
parser.error("can't {} without a value argument".format(args.mode))
请注意,这意味着program --insert
(没有value
)仍然有效。您可以通过将默认mode
设为None
,使用args.mode is not None
执行上述检查,然后执行if args.mode is None: args.mode = 'insert'
或类似工作,稍微省力一点。
答案 1 :(得分:3)
您的语法更清楚地描述为:
myprogram {--insert|--update|--delete} value
其中--insert
默认为True且值是必需的。
argparse
可以让您觉得您所需的语法必须符合
if args.insert and (args.update or args.delete):
parser.print_help()
更加明显。
在回复评论时添加:
这是伪代码(意思是我没有测试它),它显示了我将如何实现它:
parser.add_argument('--insert', action='store_true')
parser.add_argument('--update', action='store_true')
parser.add_argument('--delete', action='store_true')
parser.add_argument('value')
args = parser.parse_args(sys.argv)
if ((args.insert and args.delete) or
(args.insert and args.update) or
(args.update and args.delete)):
# can't pick more than one, complain and quit
elif not (args.update or args.delete):
# they specified no action so assume insert
args.insert = True
# now one and only one of insert/update/delete is
# True and args.value contains the argument
我希望能让事情更加清晰。
答案 2 :(得分:3)
使位置参数可选(使用'?')
parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--delete', metavar='value')
group.add_argument('--update', metavar='value')
group.add_argument('value', nargs='?')
用法是:
usage: ipython [-h] [--delete value | --update value | value]