Python 在argparse中,是否可以从多个父解析器获得源互斥的arg?

Python 在argparse中,是否可以从多个父解析器获得源互斥的arg?,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,下面将设置一个互斥组,其中只有-a或-b中的一个有效 import argparse parser = argparse.ArgumentParser() group = parser.add_add_mutually_exclusive_group() group.add_argument('-a') group.add_argument('-b') 我想从其他解析器中提供-a和-b参数。比如: a_parser = argparse.ArgumentParser() a_parser.a

下面将设置一个互斥组,其中只有-a或-b中的一个有效

import argparse

parser = argparse.ArgumentParser()
group = parser.add_add_mutually_exclusive_group()
group.add_argument('-a')
group.add_argument('-b')
我想从其他解析器中提供-a和-b参数。比如:

a_parser = argparse.ArgumentParser()
a_parser.add_argument('-a')

b_parser = argparse.ArgumentParser()
b_parser.add_argument('-b')

parser = argparse.ArgumentParser()
group = parser.add_add_mutually_exclusive_group()
group.SOME_HOW_ADD_ARGS_FROM_OTHER_PARSER(a_parser)
group.SOME_HOW_ADD_ARGS_FROM_OTHER_PARSER(b_parser)
在这两种情况下,我预计以下情况会引发关于使用不兼容参数的异常:

parser.parse_args(['-a', '1', '-b', '1'])

问题是我不知道我缺少的“SOME_HOW_ADD_ARGS_FROM_OTHER_PARSER”逻辑是否存在。如果它真的存在,我不知道怎么做。有人有什么想法吗?

是的,有一种方法,但它使用了解析器的一些隐藏属性。我用的是一个为

argparse add_互斥_组应接受现有参数以注册冲突

使用add_help=False创建两个父解析器,以防止在-h参数上发生冲突-这是标准的父解析器过程

a_parser = argparse.ArgumentParser(add_help=False)
aaAction = a.parser.add_argument('-a')
b_parser = argparse.ArgumentParser(add_help=False)
bbAction = b_parser.add_argument('-b')

parser=argparse.ArgumentParser(parents=[a_parser, b_parser])
group=parser.add_mutually_exclusive_group()
此时,解析器有3个actions参数,可以在“private”属性中看到,\u actions:

第一个是它自己的帮助,其他的都是从父母那里继承来的。我还保存了指向这些早期的aaAction和bbAction的指针。现在我们只需要将这些添加到组的_group_actions列表中:

如果安装了10984补丁,我们可以编写:

group = parser.add_mutually_exclusive_group(aaAction, bbAction)
作为创建组的一部分,将执行此追加

我们可以用以下方法进行测试:

In [31]: print parser.format_help()
usage: ipython [-h] [-a A | -b B]

optional arguments:
  -h, --help  show this help message and exit
  -a A
  -b B


In [32]: parser.parse_args(['-a','a'])
Out[32]: Namespace(a='a', b=None)

In [33]: parser.parse_args(['-a','a','-b','b'])
usage: ipython [-h] [-a A | -b B]
ipython: error: argument -b: not allowed with argument -a
An exception has occurred, use %tb to see the full traceback.
这取决于以下几条信息:

add_参数返回指向它刚刚创建的操作的指针

父级只通过复制动作点(即通过引用)向新解析器添加动作

了解解析和组将相关操作列表存储在何处

知道将操作添加到组与将其添加到解析器有多大不同并不重要

我建议在像IPython这样的交互式shell中测试这样的代码,您可以在其中查看解析器和组的属性。并随身携带Lib/argparse.py的副本:


补丁10984增加了一些代码来处理在多个组中执行操作的复杂性。通常一个操作只属于一个组。

为什么要创建多个解析器?你到底想做什么?我想创建一些适用于某些子命令的参数集。对于某些子命令,使用-a和-b是有意义的,而对于其他子命令,只有使用-a才有意义。当在同一子命令上可用时,-a和-b选项应该是互斥的。
group = parser.add_mutually_exclusive_group(aaAction, bbAction)
In [31]: print parser.format_help()
usage: ipython [-h] [-a A | -b B]

optional arguments:
  -h, --help  show this help message and exit
  -a A
  -b B


In [32]: parser.parse_args(['-a','a'])
Out[32]: Namespace(a='a', b=None)

In [33]: parser.parse_args(['-a','a','-b','b'])
usage: ipython [-h] [-a A | -b B]
ipython: error: argument -b: not allowed with argument -a
An exception has occurred, use %tb to see the full traceback.