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的一个很好的补充