python-如何从父解析器获取argparse子解析器(以检查默认值)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-如何从父解析器获取argparse子解析器(以检查默认值),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4672字,纯文字阅读大概需要7分钟。
内容图文
假设我创建了一个带有默认值的解析器,然后给它提供了一个带有另一个默认值的子解析器.
In [1]: parser = argparse.ArgumentParser(description='test')
In [2]: parser.add_argument("--test", dest="test", default="hello")
Out[2]: _StoreAction(option_strings=['--test'], dest='test', nargs=None, const=None, default='hello', type=None, choices=None, help=None, metavar=None)
In [3]: parser.get_default("test")
Out[3]: 'hello'
In [4]: subparsers = parser.add_subparsers(dest="command")
In [5]: parser_other = subparsers.add_parser("other")
In [6]: parser_other.add_argument("--other-test", dest="other_test", default="world")
Out[6]: _StoreAction(option_strings=['--other-test'], dest='other_test', nargs=None, const=None, default='world', type=None, choices=None, help=None, metavar=None)
In [7]: parser_other.get_default("other_test")
Out[7]: 'world'
一切都很好.但是,假设我有一个函数可以从上面创建并返回父解析器解析器,但是不能直接访问子解析器.
如何仍然打印出subparser参数的默认值?还是分别获得每个子解析器的句柄?
In [8]: parser._subparsers._defaults
Out[8]: {}
In [9]: parser._subparsers.get_default("other_test") # is None
似乎没有任何来自parser._subparsers或来自解析器的属性或方法可以显示默认值.
总体问题是:当您只有父解析器的句柄时,如何以编程方式访问子解析器的默认值?
解决方法:
你做对了.但是也许我可以解释一些细节.
a = parser.add_argument(...)
add_argument创建一个Action对象(或实际上是一个子类,具体取决于action参数).您可以在自己的环境中保存指向该对象的指针.但是该动作也收集在parse._actions列表中.这就是解析器跟踪其参数的方式.
阅读动作应该总是安全的.修改它可能会破坏解析器. arguments_groups有权访问列表.
subparsers = parser.add_subparsers(dest="command")
是add_argument的专用版本,它创建并返回argparse._SubParsersAction对象.次级解析器就是那个对象.如先前答案中所述,可以通过搜索正确的子类在_actions列表中找到它. (对于主解析器,子解析器只是另一个位置参数.)
subparsers维护自己的解析器专业词典,可以将其作为choices属性来访问.主解析器没有这些子解析器的任何记录.
parser_other = subparsers.add_parser("other")
创建一个解析器,将其放在选择映射中,并返回一个供您自己使用的引用(带有add_argument等).每个子解析器都有自己的_actions列表. (以及它自己的_defaults).
查看get_defaults方法的代码:
def get_default(self, dest):
for action in self._actions:
if action.dest == dest and action.default is not None:
return action.default
return self._defaults.get(dest, None)
它使用_actions属性.并查看Action的action.default属性.
self._defaults是由parser.set_defaults方法更新的字典.该方法还将其参数复制到相关的Action对象. get_defaults检查以确保dest是与特定Action无关的默认值之一. https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.set_defaults
我没有太多使用parser._subparsers属性.查看parser.add_subparsers方法,我看到它实际上是一个arguments_group. Argument_groups主要是一个帮助工具,用于对帮助行进行分组.解析器对象及其argument_groups之间的关系有些棘手,并且可能不是您要使用的东西.
这是一个示例,其中包含更多(太多)细节:
In [22]: parser = argparse.ArgumentParser()
In [23]: sp = parser.add_subparsers(title='subparsers', dest='cmd')
In [24]: sp1 = sp.add_parser('cmd1')
In [25]: sp2 = sp.add_parser('cmd2')
In [26]: parser.print_help()
usage: ipython3 [-h] {cmd1,cmd2} ...
optional arguments:
-h, --help show this help message and exit
subparsers:
{cmd1,cmd2}
In [28]: [a.dest for a in parser._actions]
Out[28]: ['help', 'cmd']
In [29]: parser._action_groups
Out[29]:
[<argparse._ArgumentGroup at 0xaf86bf2c>,
<argparse._ArgumentGroup at 0xaf86bdcc>,
<argparse._ArgumentGroup at 0xac99fa6c>]
In [30]: [g.title for g in parser._action_groups]
Out[30]: ['positional arguments', 'optional arguments', 'subparsers']
In [31]: parser._subparsers
Out[31]: <argparse._ArgumentGroup at 0xac99fa6c>
_subparsers的_defaults实际上与解析器是同一词典.
In [32]: parser.set_defaults(extra='foobar')
In [33]: parser._defaults
Out[33]: {'extra': 'foobar'}
In [34]: parser._subparsers._defaults
Out[34]: {'extra': 'foobar'}
parser._subparsers._actions也与parser._actions相同.但是该组确实会维护自己的列表操作(在帮助显示中使用).
In [35]: parser._subparsers._group_actions
Out[35]: [_SubParsersAction(option_strings=[], dest='cmd', nargs='A...', const=None,
default=None, type=None, choices=OrderedDict([...]), help=None, metavar=None)]
因此,您可以使用parser._subparsers._group_actions [0]查找subparsers操作对象,而不是搜索parsers._actions列表.
In [37]: parser._subparsers._group_actions[0].choices
Out[37]:
OrderedDict([('cmd1',
ArgumentParser(prog='ipython3 cmd1', usage=None, description=None,...)),
('cmd2',
ArgumentParser(prog='ipython3 cmd2', usage=None, description=None,...))])
再三考虑,parser._subparsers._group_actions可能没那么有用.如果您不给它一个特殊的标题,则它与所有位置参数的参数组parser._positionals相同.因此,您仍然需要验证_SubParsersAction类.
内容总结
以上是互联网集市为您收集整理的python-如何从父解析器获取argparse子解析器(以检查默认值)全部内容,希望文章能够帮你解决python-如何从父解析器获取argparse子解析器(以检查默认值)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。