python - 是否可以只使用 argparse 解析一个参数组的参数?

标签 python 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 对象和 ArgumentGroup 对象共享一个基本 ArgumentContainer 类,该类为它们提供诸如 add_argument 之类的方法。 .但是 ArgumentParser 有很多额外的代码。 ArgumentGroup 实际上只是帮助格式化 help .它不会以任何方式影响解析。

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

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

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

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

您可能还需要使用 parse_known_args因此“组”解析器不会提示它无法识别的参数。

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

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

关于python - 是否可以只使用 argparse 解析一个参数组的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31519997/

相关文章:

python - 使用 Google App Engine Python 2.7 在 Django 1.2 中自定义标签

python - 在多个 GPU 上运行相同的模型,但向每个 GPU 发送不同的用户数据

python - 有没有办法控制在 Python argparse 中评估参数的顺序

python - argparse:位置参数的默认值不起作用?

python - 从 Python 获取事件 Excel 工作簿的名称

python - 嵌入式 Python 的骨架上出现段错误?

python - 在 Python 中使用 argparse 处理无效参数

Python:如何编写看起来不错并且可以与 argparse 或 optparse 一起使用的代码?

python - Argparse:如何区分解析器和子解析器的参数

python - 使用 Python 从 HTML 提供 URL