gpt4 book ai didi

python - 如何定义两个位置参数的互斥组?

转载 作者:太空狗 更新时间:2023-10-29 17:19:47 25 4
gpt4 key购买 nike

我想使用 argparse 来制作一些代码,以便在以下两种方式中使用:

./tester.py all
./tester.py name someprocess

all 被指定或 name 带有一些额外的字符串。

我尝试实现如下:

import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('all', action='store_true', \
help = "Stops all processes")
group.add_argument('name', \
help = "Stops the named process")

print parser.parse_args()

这给了我一个错误

ValueError: mutually exclusive arguments must be optional

知道如何做对吗?在这种情况下,我也想避免使用子解析器。

最佳答案

这个问题已经有一年了,但由于所有答案都暗示了不同的语法,所以我会给出更接近 OP 的内容。

首先是OP代码的问题:

位置 store_true 没有意义(即使它被允许)。它不需要任何参数,因此它始终为 True。提供 'all' 将产生 error: unrecognized arguments: all

另一个参数采用一个值并将其分配给 name 属性。它不接受额外的 process 值。

关于 mutually_exclusive_group。该错误消息甚至在 parse_args 之前出现。为了让这样一个组有意义,所有的选择都必须是可选的。这意味着要么有一个 -- 标志,要么是一个 nargs 等于 ?* 的位置。在团队中拥有多个这样的位置是没有意义的。

使用 --all--name 的最简单的替代方法是这样的:

p=argparse.ArgumentParser()
p.add_argument('mode', choices=['all','name'])
p.add_argument('process',nargs='?')

def foo(args):
if args.mode == 'all' and args.process:
pass # can ignore the process value or raise a error
if args.mode == 'name' and args.process is None:
p.error('name mode requires a process')

args = p.parse_args()
foo(args) # now test the namespace for correct `process` argument.

接受的命名空间如下所示:

Namespace(mode='name', process='process1')
Namespace(mode='all', process=None)

choices 模仿 subparsers 参数的行为。在 parse_args 之后进行自己的测试通常比让 argparse 做一些特殊的事情更简单。

关于python - 如何定义两个位置参数的互斥组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com