我试图使用argparse模块实现以下参数依赖:./prog [-h | [-v schema] file]
这意味着用户必须传递-h或文件,如果传递文件,用户可以选择传递-v schema。
这就是我现在拥有的,但似乎不起作用:
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)
现在-x
或file
是必需的(但不是两者)。-s
在这两种情况下都是可选的,但是有一个有意义的默认值,如果省略它也没关系。如果给出了-x
,则可以忽略-s
的值。
如果有必要,可以在解析后测试args
,以确认如果args.file
不是None,那么args.schema
也不能是None。
早些时候我写过(可能是想多了):
argument_group
不能添加到mutually_exclusive_group
。这两类团体有着不同的目的和功能。之前有关于此的SO讨论(参见"相关"),以及一些相关的Python错误问题。如果您想要超越简单互斥组的测试,您可能应该在parse_args
之后进行自己的测试。这可能还需要您自己的usage
行。
argument_group
只是帮助部分中对参数进行分组和标记的一种方法。
mutually_exclusive_group
影响usage
格式(如果可以的话),并且在parse_args
期间运行测试。两者都使用"group"一词,意味着他们之间的联系比实际情况更紧密。
http://bugs.python.org/issue11588要求嵌套组,以及测试"包容性"的能力。我试图说明,"组"不足以表达用户想要的所有类型的测试。但是泛化测试机制是一回事,想出一个直观的API是另一回事。像这样的问题表明argparse
确实需要某种"嵌套组"语法。