在不同的argparser组中允许相同的选项

时间:2014-05-21 06:17:59

标签: python argparse

是否可以允许相同的argparse选项位于2个不同的argparser组中? 这实际上是我想要实现的目标: -

#!/usr/bin/env python
import argparse
... ... ...
g1 = parser.add_argument_group('g1')
g2 = parser.add_argument_group('g2')
g1.add_argument('--aa')
g1.add_argument('--common')
g2.add_argument('--bb')
g2.add_argument('--common')

...打印好的帮助看起来像这样: -

usage: ...
... ... ...
g1:
    --aa [aa]
    --common [common]

g2:
    -bb [bb]
    --common [common]

但这是不可能的,因为argparse抱怨'冲突的选项字符串'

2 个答案:

答案 0 :(得分:2)

http://bugs.python.org/issue10984讨论了向两个不同的mutually_exclusive_groups添加参数。对argument_groups执行相同操作的方法与此类似,但更简单。

import argparse
parser=argparse.ArgumentParser()
g1=parser.add_argument_group('group1')
g1.add_argument('-a')
caction=g1.add_argument('-c')
g2=parser.add_argument_group('group2')
g2.add_argument('-b')
g2._group_actions.append(caction)
parser.print_help()

它是一种kludge,从某种意义上说它正在修改一个私人的'小组的属性。

结果:

usage: ipython [-h] [-a A] [-c C] [-b B]

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

group1:
  -a A
  -c C

group2:
  -b B
  -c C

这里发生了什么。 add_argument创建Action,将其注册到parser,然后将其返回。这是caction捕获的内容。如果添加到组中,它还会将操作注册到组中 - 将其添加到_group_actions列表中。

如果执行g2.add_argument('-c'),则会收到错误,因为解析器已经有一个带有该选项字符串的操作。您正在添加'它是一个不同的群体是偶然的。 kludge通过将其添加到组的列表来解决这个问题,而不会创建新的操作。

如果文档中不明显,argument_groups基本上是一个帮助'方便。它们根本不影响解析。还有其他方法可以自定义help。例如,将--common添加到parser,可能会使用SUPPRESS帮助热线。然后在每个组的description中提及它。

答案 1 :(得分:1)

在这种特殊情况下,您可以将--aa和--bb互为排斥。

import argparse
parser = argparse.ArgumentParser()
mutex = parser.add_mutually_exclusive_group()
mutex.add_argument('--aa', action = 'store_true')
mutex.add_argument('--bb', action = 'store_true')
parser.add_argument('--common', action = 'store_true')
args = parser.parse_args()

导致

usage: a.py [-h] [--aa | --bb] [--common]

通常,argparse的问题是你必须在调用add_argument时创建一个选项。

这是一个有点相关的主题:Does argparse (python) support mutually exclusive groups of arguments?

有一个补丁,允许您在多个互斥组中拥有一个参数: http://bugs.python.org/issue10984

你可以做的另一件事是使用argparse子分析器,或者完全使用另一个命令行解析器。