Python 在组之间使用互斥
我试图在不同的群体之间建立一个相互排斥的群体: 我有参数-a,-b,-c,我想与-a和-b一起冲突,或者与-a和-c一起冲突。帮助应该显示类似[-a |([-b][-c])的内容 以下代码似乎没有相互排斥的选项:Python 在组之间使用互斥,python,python-2.7,argparse,Python,Python 2.7,Argparse,我试图在不同的群体之间建立一个相互排斥的群体: 我有参数-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_g
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\u组
更改为add\u mutual\u exclusive\u组
将所有内容变为互斥:
> 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])]添加参数?因此,这已经被问了很多次了。简单的答案是“使用argparse,您不能”。然而,这是一个简单的答案。你可以利用次帕瑟,所以:
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
以及:
如果您喜欢问题中所述的参数,请看一看,它看起来很可爱,应该完全符合您的要求。
参数组
不会影响解析。它们只是帮助格式化。因此,在一个相互排斥的组中定义一个组对解决这个问题没有帮助
有一个建议的补丁,'argparse add_mutual-exclusive_group应该接受现有参数来注册冲突“
,它允许您定义两个互斥_group
,一个[-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()
用法
无法正确显示这两个组。但它确实接受-b-c
,而反对-a-b
和-a-c
。但是你可以写一个自定义的用法行。不完全是我想要的,因为它没有给我选择只有-c(没有-b)。这是真的,我道歉。我不认为使用argparse可以得到您想要的东西,但我仍然认为docopt是一个不错的选择,您只需将用法:myscript.py[-h |-a |[-b-c]]添加到您的docstring中,它就会为您解决所有问题
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()