分组ArgParse

Har*_*bus 5 python arguments argparse

因此,我使用的是argparse,并且尝试创建似乎无法在任何地方找到解决方案的东西。

我正在努力做[A | [B C]]。所以我有A(B and 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")
Run Code Online (Sandbox Code Playgroud)

但这最终给了我 [A | [B | C]]

use*_*253 5

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)
Run Code Online (Sandbox Code Playgroud)

这是执行日志:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

  • 最后一句有点误导,因为互斥体组仍然是可选的。因此,这更像是“当用户必须从给定的一组选项中选择最多一个选项时”。当设置 required=True 时,您的句子适用。 (2认同)
  • 现在是 2023 年,但我正在提交一项编辑,按照 @tuexss 的建议和作者的要求,将措辞更改为“最多一个选项” (2认同)

hpa*_*ulj 4

互斥组机制仅适用于简单(平面)互斥或组。没有将一个组嵌套在另一个组中或应用其他逻辑(等)的and机制any

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

子解析器提供了另一种分组逻辑,它可能适合您。

如果您需要更详细地探索它,这已经在其他 SO 问题和 Python bug/问题中提出。

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

argument groups尽管有这个名字,但不要与相互排斥的群体合作。他们的预期目的完全不同(帮助热线的分组)。您可以将一个互斥组嵌套在另一个组中,但最终效果是将所有内容放入一个组中。

argparse:所需组中的一些互斥参数

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

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')
Run Code Online (Sandbox Code Playgroud)

与结果运行

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
Run Code Online (Sandbox Code Playgroud)