是否可以使用 argparse 只解析一个参数组的参数?
Is it possible to only parse one argument group's parameters with 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")
group1_args = group1.parse_args()
group2_args = group2.parse_args()
但是,我收到以下错误:
Traceback (most recent call last):
File "test.py", line 19, in <module>
group1_args = group1.parse_args()
AttributeError: '_ArgumentGroup' object has no attribute 'parse_args'
有没有办法只获取一个参数组的参数?
如您的错误消息所示,ArgumentGroup 不是解析器,特别是它没有 parse_args
方法。
ArgumentParser objects 和 ArgumentGroup objects 共享一个基本的 ArgumentContainer class,为它们提供类似 add_argument
的方法。但是 ArgumentParser 有很多额外的代码。 ArgumentGroup 实际上只是帮助格式化 help
。它不会以任何方式影响解析。
为了增加混淆,mutually_exclusive_group
subclasses ArgumentGroup
,但只影响 help
的 usage
部分,并影响解析引发错误消息。
如果您详细说明为什么要这样做,我们可以想出一些可行的替代方案。例如,有一个 parents
机制,可以让你 insert
一个 parser
变成另一个。或者 subparsers
通过 'command' 个参数将解析控制传递给子解析器。
https://docs.python.org/3/library/argparse.html#parents
在自己的 parent
解析器中定义每个组,可以让您控制帮助显示和解析。 parents 的唯一问题是您必须在某种程度上使用 help=False
以防止重复 -h
选项。
您可能还需要使用 parse_known_args
,这样 'group' 解析器就不会抱怨它无法识别的参数。
这是一种显示所有 args
条目的方法,按参数组分组。我包括了 2 个默认组,optionals 和 positionals。它确实利用了解析器的 'private' 属性。这样做有一点风险,但这不是未来补丁中可能会改变的事情。
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())
print([g.title for g in parser._action_groups]) # all group titles
print(group1._group_actions) # arguments/actions of `group1`
print([a.dest for a in group2._group_actions]) # actions for group2
for group in parser._action_groups:
group_dict={a.dest:getattr(args,a.dest,None) for a in group._group_actions}
print(group.title, argparse.Namespace(**group_dict))
生产
1513:~/mypy$ python stack31519997.py
['positional arguments', 'optional arguments', 'group1', 'group2']
[_StoreAction(option_strings=['--test1'], dest='test1', nargs=None, const=None, default=None, type=None, choices=None, help='test1', metavar=None)]
['test2']
('positional arguments', Namespace())
('optional arguments', Namespace(help=None))
('group1', Namespace(test1='one'))
('group2', Namespace(test2='two'))
如果使用字典版本 vars(args)
会更方便。 argparse.Namespace(**adict)
从字典重新创建命名空间。
当然,您可以制作自己的 dest
列表,['test1']
和 ['test2']
。
我想做这样的事情:
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")
group1_args = group1.parse_args()
group2_args = group2.parse_args()
但是,我收到以下错误:
Traceback (most recent call last):
File "test.py", line 19, in <module>
group1_args = group1.parse_args()
AttributeError: '_ArgumentGroup' object has no attribute 'parse_args'
有没有办法只获取一个参数组的参数?
如您的错误消息所示,ArgumentGroup 不是解析器,特别是它没有 parse_args
方法。
ArgumentParser objects 和 ArgumentGroup objects 共享一个基本的 ArgumentContainer class,为它们提供类似 add_argument
的方法。但是 ArgumentParser 有很多额外的代码。 ArgumentGroup 实际上只是帮助格式化 help
。它不会以任何方式影响解析。
为了增加混淆,mutually_exclusive_group
subclasses ArgumentGroup
,但只影响 help
的 usage
部分,并影响解析引发错误消息。
如果您详细说明为什么要这样做,我们可以想出一些可行的替代方案。例如,有一个 parents
机制,可以让你 insert
一个 parser
变成另一个。或者 subparsers
通过 'command' 个参数将解析控制传递给子解析器。
https://docs.python.org/3/library/argparse.html#parents
在自己的 parent
解析器中定义每个组,可以让您控制帮助显示和解析。 parents 的唯一问题是您必须在某种程度上使用 help=False
以防止重复 -h
选项。
您可能还需要使用 parse_known_args
,这样 'group' 解析器就不会抱怨它无法识别的参数。
这是一种显示所有 args
条目的方法,按参数组分组。我包括了 2 个默认组,optionals 和 positionals。它确实利用了解析器的 'private' 属性。这样做有一点风险,但这不是未来补丁中可能会改变的事情。
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())
print([g.title for g in parser._action_groups]) # all group titles
print(group1._group_actions) # arguments/actions of `group1`
print([a.dest for a in group2._group_actions]) # actions for group2
for group in parser._action_groups:
group_dict={a.dest:getattr(args,a.dest,None) for a in group._group_actions}
print(group.title, argparse.Namespace(**group_dict))
生产
1513:~/mypy$ python stack31519997.py
['positional arguments', 'optional arguments', 'group1', 'group2']
[_StoreAction(option_strings=['--test1'], dest='test1', nargs=None, const=None, default=None, type=None, choices=None, help='test1', metavar=None)]
['test2']
('positional arguments', Namespace())
('optional arguments', Namespace(help=None))
('group1', Namespace(test1='one'))
('group2', Namespace(test2='two'))
如果使用字典版本 vars(args)
会更方便。 argparse.Namespace(**adict)
从字典重新创建命名空间。
当然,您可以制作自己的 dest
列表,['test1']
和 ['test2']
。