组中组 ArgParse
Group in a group 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")
然而,这最终给了我 [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
互斥组适用于用户必须 select 给定集合中的至少一个选项,或者 required=True
只有一个选项的情况。
互斥组机制只是针对简单的(平面)排他或组。没有将一个组嵌套在另一个组中或应用其他逻辑(and
、any
等)的机制。
解析后需要自己做测试。只要默认值合理(例如默认值 None
),这并不难。
子解析器提供了另一种分组逻辑,可能对您有用。
这已在其他 SO 问题和 Python bug/issue 中提出,如果您需要更详细地探讨它。
===============
argument groups
,尽管名称如此,但不适用于相互排斥的组。他们的预期目的完全不同(求助热线分组)。您可以将一个互斥的组嵌套在另一个组中,但最终效果是将所有内容都放在一个组中。
==============================
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
所以我正在使用 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")
然而,这最终给了我 [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
互斥组适用于用户必须 select 给定集合中的至少一个选项,或者 required=True
只有一个选项的情况。
互斥组机制只是针对简单的(平面)排他或组。没有将一个组嵌套在另一个组中或应用其他逻辑(and
、any
等)的机制。
解析后需要自己做测试。只要默认值合理(例如默认值 None
),这并不难。
子解析器提供了另一种分组逻辑,可能对您有用。
这已在其他 SO 问题和 Python bug/issue 中提出,如果您需要更详细地探讨它。
===============
argument groups
,尽管名称如此,但不适用于相互排斥的组。他们的预期目的完全不同(求助热线分组)。您可以将一个互斥的组嵌套在另一个组中,但最终效果是将所有内容都放在一个组中。
==============================
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