Python 在组之间使用互斥

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

我试图在不同的群体之间建立一个相互排斥的群体: 我有参数-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\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()