参数组之间的相互排斥

时间:2014-05-30 09:45:19

标签: python argparse

我正在尝试使用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()

看起来你无法将一个arg组添加到互斥组或我错过了什么?

1 个答案:

答案 0 :(得分:4)

如果-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不是无,那么args.schema也不能。


早些时候我写过(也许是在思考这个问题):

无法将argument_group添加到mutually_exclusive_group。这两种群体有不同的目的和功能。之前有过SO讨论(参见“相关”),以及一些相关的Python bug问题。如果您希望测试超出简单的互斥组,您可能应该在parse_args之后进行自己的测试。这可能还需要您自己的usage行。

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

mutually_exclusive_group会影响usage格式(如果可以),并且还会在parse_args期间运行测试。对两者使用“组”意味着他们的联系比他们实际上更多。

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