我正在尝试使用 argparse 模块实现以下参数依赖项:
./prog [-h | [-v schema] file]
这意味着用户必须传递 -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()
Run Code Online (Sandbox Code Playgroud)
看起来您无法将 arg 组添加到互斥体组中,还是我遗漏了某些内容?
如果-h表示默认帮助,那么这就是您所需要的(此帮助已经是独占的)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file')
parser.add_argument('-s','--schema')
parser.parse_args('-h'.split()) # parser.print_help()
Run Code Online (Sandbox Code Playgroud)
生产
usage: stack23951543.py [-h] [-s SCHEMA] file
...
Run Code Online (Sandbox Code Playgroud)
如果-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())
Run Code Online (Sandbox Code Playgroud)
用法是:
usage: stack23951543.py [-h] [-s SCHEMA] (-x | file)
Run Code Online (Sandbox Code Playgroud)
现在-x或file是必需的(但不是两者)。 -s在任何一种情况下都是可选的,但如果有一个有意义的默认值,则省略它也没关系。如果-x给出了,您可以忽略该-s值。
如果有必要,您可以args在解析后进行测试,以确认如果args.file不是 None,则args.schema也不能是。
早些时候我写过(也许是过度思考了这个问题):
Anargument_group不能添加到 a 中mutually_exclusive_group。这两种团体有不同的目的和功能。之前有对此进行过讨论(请参阅“相关”),以及一些相关的 Python 错误问题。如果您想要超越简单的互斥组的测试,您可能应该在 后进行自己的测试parse_args。这可能还需要您自己的usage线路。
Anargument_group只是帮助部分中对参数进行分组和标记的一种方法。
Amutually_exclusive_group会影响usage格式(如果可以的话),并且还会在 期间运行测试parse_args。两者都使用“群体”一词意味着他们的联系比实际情况更加紧密。
http://bugs.python.org/issue11588要求嵌套组,以及测试“包容性”的能力。我试图证明“组”不够通用,不足以表达用户想要的所有类型的测试。但推广测试机制是一回事,而提出直观的 API 则是另一回事。像这样的问题表明argparse确实需要某种“嵌套组”语法。
| 归档时间: |
|
| 查看次数: |
3470 次 |
| 最近记录: |