python - 参数组之间的互斥

标签 python argparse

我正在尝试使用 argparse 模块实现以下参数依赖性: ./prog [-h | [-v 模式] 文件] 这意味着用户必须传递 -h 或文件,如果传递文件,用户可以选择传递 -v 架构。

这就是我现在拥有的,但似乎不起作用:

import argparse

parser = argparse.ArgumentParser()
mtx = parser.add_mutually_exclusive_group()
mtx.add_argument('-h', ...)  
grp = mtx.add_argument_group()
grp.add_argument('-v', ...)
grp.add_argument('file', ...)   
args = parser.parse_args()

看起来您无法将 arg 组添加到互斥锁组,还是我遗漏了什么?

最佳答案

如果-h表示默认帮助,那么这就是你所需要的(这个帮助已经是独占的了)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file')
parser.add_argument('-s','--schema')
parser.parse_args('-h'.split())  # parser.print_help()

生产

usage: stack23951543.py [-h] [-s SCHEMA] file
...

如果 -h 是指其他操作,我们将其重命名为 -x。这将接近您所描述的

parser = argparse.ArgumentParser()
parser.add_argument('-s','--schema', default='meaningful default value')
mxg = parser.add_mutually_exclusive_group(required=True)
mxg.add_argument('-x','--xxx', action='store_true')
mxg.add_argument('file', nargs='?')
parser.parse_args('-h'.split())

用法是:

usage: stack23951543.py [-h] [-s SCHEMA] (-x | file)

现在 -xfile 是必需的(但不是两者)。 -s 在这两种情况下都是可选的,但是如果有一个有意义的默认值,它是否被省略也没关系。如果给出了 -x,您可以忽略 -s 值。

如有必要,您可以在解析后测试 args,以确认如果 args.file 不是 None,则 args.schema 可以'两者都不是。


之前我写过(可能是想多了这个问题):

不能将 argument_group 添加到 mutually_exclusive_group。两种群体的目的和功能各不相同。之前有关于此的 SO 讨论(请参阅“相关”),以及一些相关的 Python 错误问题。如果您想要超越简单互斥组的测试,您可能应该在 parse_args 之后进行自己的测试。这可能还需要您自己的 usage 行。

argument_group 只是一种在帮助部分对参数进行分组和标记的方法。

mutually_exclusive_group 会影响usage 格式(如果可以的话),并且还会在 parse_args 期间运行测试。两者都使用“组”意味着它们比实际更紧密地联系在一起。

http://bugs.python.org/issue11588要求嵌套组,以及测试“包容性”的能力。我试图证明“组”不够通用,无法表达用户想要的所有类型的测试。但推广测试机制是一回事,提出直观的 API 则完全是另一回事。像这样的问题表明 argparse 确实需要某种“嵌套组”语法。

关于python - 参数组之间的互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23951543/

相关文章:

Python 3 索引超出范围错误

python - 如何让3个函数在一个程序中运行

python - 如何在将元素 1 乘 1 的同时连接两个列表

python - 当 argparse 指向路径名时,我怎么能默认什么都不做呢?

python - Argparse::ask 1 或 3 个参数

python - 将轴标题添加到 3D 曲面图袖扣和绘图

python - 变长参数

python - 带有选择选项的条件 argparse

python - 我可以使用 argparse 帮助字符串来描述我的脚本返回值吗?

python - 将列表中的项目添加到另一个列表中的字典