6

我知道将多个位置参数放到一个相互排斥的组中是没有意义的,因为你不能说谁是谁。但我需要在其中包含一个位置参数。

我需要的:

$ 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')
4

3 回答 3

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您可以通过使用默认值be None,使用 进行上述检查args.mode is not None,然后执行if args.mode is None: args.mode = 'insert'或类似操作来避免这种情况。

于 2013-04-07T15:49:50.317 回答
3

您的语法更清楚地描述为:

myprogram {--insert|--update|--delete} value

其中--insert默认为 True 和 value 是必需的。

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

我希望这能让事情更清楚。

于 2013-04-07T01:51:45.157 回答
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]
于 2013-08-09T05:14:51.013 回答