9

我试图在不同组之间建立一个互斥组:我有参数-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_groupadd_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])]?

4

2 回答 2

2

所以,这个问题被问了好几次了。简单的答案是“使用 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

和:

$ python parser b -h
usage: parser b [-h] [-c]

optional arguments:
  -h, --help  show this help message and exit
  -c          c help

如果您更喜欢问题中所述的论点,请查看docopt,它看起来很可爱,并且应该完全按照您的意愿行事。

于 2013-05-31T12:24:27.923 回答
0

argument_groups不影响解析。他们只是有助于格式化。因此,在 an 中定义一个组对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。但是您可以编写自定义使用行。

于 2013-09-01T04:29:32.553 回答