Python 组ArgParse中的组

Python 组ArgParse中的组,python,arguments,argparse,Python,Arguments,Argparse,所以我使用argparse,我试图创建一些我似乎在任何地方都找不到解决方案的东西 我正在做[A |[B C]]。所以要么我有A要么(B和C) 编辑 因此,一些代码示例如下 parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group(required=False) group.add_argument("-a") more = group.add_mutually_exclusive_group()

所以我使用argparse,我试图创建一些我似乎在任何地方都找不到解决方案的东西

我正在做
[A |[B C]]
。所以要么我有
A
要么
(B和C)

编辑 因此,一些代码示例如下

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=False)
group.add_argument("-a")
more = group.add_mutually_exclusive_group()
more.add_argument("-b")
more.add_argument("c")
然而,这最终给了我
[A |[B | C]]

import argparse

parser = argparse.ArgumentParser(description='test group')
subparsers = parser.add_subparsers(help='sub-commands help')
sp = subparsers.add_parser('A', help='A command')
sp.set_defaults(cmd = 'A')
sp = subparsers.add_parser('B', help='B command')
sp.set_defaults(cmd = 'B')
sp.add_argument('C', help='C option')

args = parser.parse_args()

if (args.cmd == 'A'):
    print("running A mode")
else:
    print("running B mode with C=%s" % args.C)
以下是执行日志:

$ python test.py A
running A mode
$ python test.py B
usage: test.py B [-h] C
$ python test.py B some
running B mode with C=some

互斥组适用于用户必须从给定集合中选择至少一个选项的情况,或者如果
required=True
正好是一个选项。

互斥组机制仅适用于简单(平面)互斥或组。没有任何机制可以将一个组嵌套到另一个组中,或者应用其他逻辑(
任何
等)

解析后,您需要自己进行测试。只要默认值合理(例如默认值
None
),这并不难

子parser提供了另一种分组逻辑,可能适合您

如果您需要更详细地研究,其他SO问题和Python错误/问题中也提出了这一点

===============

import argparse

usage = '%(prog)s [A | [B ? C]]'
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument('-a')
parser.add_argument('-b')
parser.add_argument('-c')
args=parser.parse_args()

print(args)
if args.a is not None:
   if not(args.b is None and args.c is None):
      parser.error('Cannot use b or c with a')
参数组
,尽管名称不同,但不适用于相互排斥的组。它们的预期目的完全不同(帮助热线的分组)。您可以将一个相互排斥的组嵌套在另一个组中,但最终效果是将所有内容都放在一个组中

============================

import argparse

usage = '%(prog)s [A | [B ? C]]'
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument('-a')
parser.add_argument('-b')
parser.add_argument('-c')
args=parser.parse_args()

print(args)
if args.a is not None:
   if not(args.b is None and args.c is None):
      parser.error('Cannot use b or c with a')
有结果的运行

1722:~/mypy$ python3 stack37311550.py -a 1
Namespace(a='1', b=None, c=None)
1726:~/mypy$ python3 stack37311550.py -a 1 -b2
Namespace(a='1', b='2', c=None)
usage: stack37311550.py [A | [B ? C]]
stack37311550.py: error: Cannot use b or c with a
1726:~/mypy$ python3 stack37311550.py -c3 -b2
Namespace(a=None, b='2', c='3')
1726:~/mypy$ python3 stack37311550.py -c3 -b2 -a1
Namespace(a='1', b='2', c='3')
usage: stack37311550.py [A | [B ? C]]
stack37311550.py: error: Cannot use b or c with a

听起来您需要,但更多信息和一些示例代码会有所帮助。最后一句话有点误导,因为互斥组仍然可以是可选的。因此,这相当于“当用户必须从给定集合中最多选择一个选项时”。你的句子在required=True设置时适用。我同意这一更改。你能编辑答案吗(我的意思是,你有足够的声誉,并且满足了所有其他先决条件)?如果是,我将批准您的更改。