我正在尝试在不同的群组之间建立互斥的群组: 我有参数-a,-b,-c,我希望与-a和-b一起发生冲突,或者-a和-c在一起。帮助应该显示类似[-a | ([-b] [-c])]。
以下代码似乎没有互斥选项:
import argparse
parser = argparse.ArgumentParser(description='My desc')
main_group = parser.add_mutually_exclusive_group()
mysub_group = main_group.add_argument_group()
main_group.add_argument("-a", dest='a', action='store_true', default=False, help='a help')
mysub_group.add_argument("-b", dest='b', action='store_true',default=False,help='b help')
mysub_group.add_argument("-c", dest='c', action='store_true',default=False,help='c help')
parser.parse_args()
解析不同的组合 - 全部通过:
> python myscript.py -h
usage: myscript.py [-h] [-a] [-b] [-c]
My desc
optional arguments:
-h, --help show this help message and exit
-a a help
> python myscript.py -a -c
> python myscript.py -a -b
> python myscript.py -b -c
我尝试将mysub_group
更改为add_mutually_exclusive_group
,将所有内容变为互斥:
> python myscript.py -h
usage: myscript.py [-h] [-a | -b | -c]
My desc
optional arguments:
-h, --help show this help message and exit
-a a help
-b b help
-c c help
如何为[-a |添加参数? ([-b] [-c])]?
答案 0 :(得分:2)
所以,这已被问过很多次了。简单的答案是“与argparse,你不能”。但是,这就是简单的答案。你可以使用subparsers,所以:
import argparse
parser = argparse.ArgumentParser(description='My desc')
sub_parsers = parser.add_subparsers()
parser_a = sub_parsers.add_parser("a", help='a help')
parser_b = sub_parsers.add_parser("b", help='b help')
parser_b.add_argument("-c", dest='c', action='store_true',default=False,help='c help')
parser.parse_args()
然后你得到:
$ python parser -h
usage: parser [-h] {a,b} ...
My desc
positional arguments:
{a,b}
a a help
b b help
optional arguments:
-h, --help show this help message and exit
和
$ python parser b -h
usage: parser b [-h] [-c]
optional arguments:
-h, --help show this help message and exit
-c c help
如果您更喜欢问题中所述的论据,请查看docopt,它看起来很可爱,并且应该完全按照您的意愿行事。
答案 1 :(得分:0)
argument_groups
不影响解析。他们只是帮助格式化。因此,在mutually_exclusive_group
中定义一个组对此问题没有帮助。
有一个建议的补丁http://bugs.python.org/issue10984,'argparse add_mutually_exclusive_group should accept existing arguments to register conflicts'
,可让您定义两个mutually_exclusive_groups
,一个[-a | -b]
和另一个[-a | -c]
。创建包含已定义的参数(-a
)的第二个组是此修补程序的简单部分。生成有意义的使用行更加困难,并且需要重写几个HelpFormatter
方法。
import argparse
parser = argparse.ArgumentParser(description='My desc')
group1 = parser.add_mutually_exclusive_group()
action_a = group1.add_argument("-a", dest='a', action='store_true', default=False, help='a help')
group1.add_argument("-b", dest='b', action='store_true',default=False,help='b help')
group2 = parser.add_mutually_exclusive_group()
group2.add_argument("-c", dest='c', action='store_true',default=False,help='c help')
group2._group_actions.append(action_a) # THE KLUDGE
print parser.format_usage()
# usage: stack16769409.py [-h] [-a | -b] [-c]
args = parser.parse_args()
Usage
未正确显示2组。但它反对-b -c
和-a -b
接受-a -c
。但您可以编写自定义使用行。