【问题标题】:Is it possible to only parse one argument group's parameters with argparse?是否可以只使用 argparse 解析一个参数组的参数?
【发布时间】:2015-10-09 18:46:33
【问题描述】:

我想做这样的事情:

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'

有没有办法只获取一个参数组的参数?

【问题讨论】:

  • 在解析所有参数之前,您如何知道存在哪个组的参数?
  • 也许只是创建单独的 ArgumentParser 实例?
  • @larsks 你能详细说明一下吗?会利用parse_known_args()吗?

标签: python argparse


【解决方案1】:

正如您的错误消息所示,ArgumentGroup 不是解析器,特别是它没有 parse_args 方法。

ArgumentParser 对象和 ArgumentGroup 对象共享一个基本 ArgumentContainer 类,该类为它们提供add_argument 等方法。但是 ArgumentParser 有很多额外的代码。 ArgumentGroup 实际上只是格式化help 的辅助工具。它不会以任何方式影响解析。

为了增加混淆,mutually_exclusive_groupArgumentGroup 的子类,但仅影响helpusage 部分,并通过引发错误消息影响解析。

如果您详细说明为什么要这样做,我们可以提出一些可行的替代方案。例如,有一个parents 机制,可以让您将insert 一个parser 转换成另一个。或者 subparsers 通过“命令”参数将解析控制传递给子解析器。


https://docs.python.org/3/library/argparse.html#parents

在自己的parent 解析器中定义每个组,可以让您控制帮助显示和解析。父母唯一的问题是您必须在某种程度上使用help=False 以防止-h 选项的重复。

您可能还需要使用parse_known_args,这样“组”解析器就不会抱怨它无法识别的参数。


这是一种显示所有args 条目的方法,按参数组分组。我包括 2 个默认组、可选组和位置组。它确实利用了解析器的“私有”属性。这样做有一点风险,但这不是未来补丁中可能会改变的事情。

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']

【讨论】:

  • 这纯粹是为了可读性。我有两类参数,并希望在使用它们时清楚地表示出来。
  • 我还在group1.parse_args()group2.parse_args() 之前调用了parser.parse_args(),以便-h 将显示两组参数的帮助。
  • 听起来您可能对将args=parser.parse_args() 分成 2 个或更多子集而不重新解析的方式更感兴趣。
  • 是的!不久前我才意识到。有没有办法做到这一点?
  • 我添加了一种按组收集命名空间属性的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2018-12-14
  • 2014-03-04
  • 1970-01-01
  • 2015-11-08
  • 2016-05-30
相关资源
最近更新 更多