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

时间:2015-07-20 15:07:31

标签: python argparse

我希望做这样的事情:

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'

但是,我收到以下错误:

function checkPassword(password)
{
    password_txt = document.getElementById('<%= password_txt.ClientID %>');
    if (password == '')
    {
        password_lbl.innerHTML = 'Password must be at least 6 characters';
        password_lbl.style.color = "red";
        password_txt.style.outline = "1px solid red"
        //register_btn.disabled = true;
        passwordCheck = false;
    }
    else
    {
        password_lbl.innerHTML = 'Perfect!';
        password_lbl.style.color = "green";
        password_txt.style.outline = "1px solid green"
        //register_btn.disabled = true;
    }

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

1 个答案:

答案 0 :(得分:2)

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

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

要添加混淆,mutually_exclusive_group子类ArgumentGroup,但仅影响usage的{​​{1}}部分,并通过引发错误消息来影响解析。

如果你详细说明为什么要这样做,我们可以提出一些可行的替代方案。例如,有help机制,可让您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']