Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python argparse:如何分别获取参数组的名称空间对象?_Python_Argparse - Fatal编程技术网

Python argparse:如何分别获取参数组的名称空间对象?

Python argparse:如何分别获取参数组的名称空间对象?,python,argparse,Python,Argparse,我将一些命令行参数分组如下: cmdParser = argparse.ArgumentParser() cmdParser.add_argument('mainArg') groupOne = cmdParser.add_argument_group('group one') groupOne.add_argument('-optA') groupOne.add_argument('-optB') groupTwo = cmdParser.add_argument_group('group

我将一些命令行参数分组如下:

cmdParser = argparse.ArgumentParser()
cmdParser.add_argument('mainArg')

groupOne = cmdParser.add_argument_group('group one')
groupOne.add_argument('-optA')
groupOne.add_argument('-optB')

groupTwo = cmdParser.add_argument_group('group two')
groupTwo.add_argument('-optC')
groupTwo.add_argument('-optD')
我如何解析上述内容,从而得到三个不同的名称空间对象

global_args - containing all the arguments not part of any group
groupOne_args - containing all the arguments in groupOne
groupTwo_args - containing all the arguments in groupTwo

谢谢大家!

argparse
中没有任何东西是专门用来做这件事的

无论如何,
解析器
从两个参数组开始,一个显示为
位置
,另一个显示为
选项
(我忘记了确切的标题)。在你的例子中,实际上有4个组

解析器仅在格式化帮助时使用参数组。对于解析,所有参数都放在主
解析器中。\u actions
列表中。在解析过程中,解析器只传递一个名称空间对象

您可以使用不同的参数集定义单独的解析器,并使用
parse\u known\u args
调用每个解析器。使用
选项
(标记的)参数比使用
位置
效果更好。这就是你的帮助

我在其他SO问题中探索了一个新的
名称空间
类,该类可以基于某种点状的
dest
(名称如
group1.optA
group2.optC
)嵌套值。我不记得是否必须自定义
操作

基本要点是,在将值保存到命名空间时,解析器或实际上是
操作
(参数)对象执行以下操作:

setattr(namespace, dest, value)

这(和getattr/hasattr)是解析器对
名称空间
的全部期望。默认的
名称空间
类很简单,只不过是一个普通的
对象
子类。但它可以更详细

您可以这样做:

import argparse
parser = argparse.ArgumentParser()

group1 = parser.add_argument_group('group1')
group1.add_argument('--test1', help="test1")

group2 = parser.add_argument_group('group2')
group2.add_argument('--test2', help="test2")

args = parser.parse_args('--test1 one --test2 two'.split())

arg_groups={}

for group in parser._action_groups:
    group_dict={a.dest:getattr(args,a.dest,None) for a in group._group_actions}
    arg_groups[group.title]=argparse.Namespace(**group_dict)
这将为您提供普通arg,以及包含每个添加组的名称空间的字典arg_组


(改编自)

很长一段时间以来,我一直在寻找解决方案,
我想我终于明白了。
所以我就把它放在这里

from argparse import ArgumentParser

def _parse_args():
    parser = ArgumentParser()
    parser.add_argument('-1', '--flag-1', action='store_true', default=False)
    parser.add_argument('-2', '--flag-2', action='store_true', default=False)
    parser.add_argument('-3', '--flag-3', action='store_true', default=False)

    args, unknown = parser.parse_known_args()
    print(f"args        : {args}")
    print(f"unknown     : {unknown}")

    hidden = ArgumentParser(add_help=False)
    hidden.add_argument('-d', '--debug', action='store_true', default=False)
    hidden_args = hidden.parse_args(unknown)
    print(f"hidden_args : {hidden_args}")

if __name__ == "__main__":
    _parse_args()
因此:
显示帮助:

ubuntu → playAround $ ./test.py -h
usage: test.py [-h] [-1] [-2] [-3]

optional arguments:
  -h, --help    show this help message and exit
  -1, --flag-1
  -2, --flag-2
  -3, --flag-3
使用调试标志:

ubuntu → playAround $ ./test.py -d
args        : Namespace(flag_1=False, flag_2=False, flag_3=False)
unknown     : ['-d']
hidden_args : Namespace(debug=True)
使用标志1和2:

ubuntu → playAround $ ./test.py -12
args        : Namespace(flag_1=True, flag_2=True, flag_3=False)
unknown     : []
hidden_args : Namespace(debug=False)
使用标志1和2以及调试:

ubuntu → playAround $ ./test.py -12 -d
args        : Namespace(flag_1=True, flag_2=True, flag_3=False)
unknown     : ['-d']
hidden_args : Namespace(debug=True)
使用此方法唯一不能做的事情是将debug short标志沿边传递给其他短标志:

ubuntu → playAround $ ./test.py -12d
usage: test.py [-h] [-1] [-2] [-3]
test.py: error: argument -2/--flag-2: ignored explicit argument 'd'

我认为argparse没有这个功能。谢谢你的详细解释。最后,我根据需要手动对名称空间属性进行分组。如果argparse允许用户按组名检索选项(即使用“组”概念不仅仅显示帮助屏幕),那么它将是对argparse的一个很好的补充