我怎么知道解析器是否已经调用过add_subparsers()

时间:2019-06-05 20:30:20

标签: python-3.x argparse

我想创建一个函数,它将一个子命令添加到解析器中。

def add_subparser(parser, command):
   sub_parsers = parser.add_subparsers('more commands')
   new_parser = sub_parsers.add_parser('free')
   return new_parser

在我看来,第一行需要检查parser是否已经有子解析器。什么是进行检查的好方法?

(旁注:将来的不错的功能是get_subparsers,它返回单例。)

1 个答案:

答案 0 :(得分:1)

查看<input id="login" style="display: block" type="button" value="Log In" onClick="DoEvent()" /> 代码。 argparse.py方法始于:

add_subparsers

,稍后将def add_subparsers(self, **kwargs): if self._subparsers is not None: self.error(_('cannot have multiple subparser arguments')) 设置为新值。

但是,如果您不想查看self._subparsers,则可以将新的parser._subparsers命令包装在add_subparses块中。

try/except使用特殊的子解析器子类创建位置add_subparsers。这就是我们通常分配给变量的内容,并在接下来的几行中使用。 (作为补充,Action还返回一个Action子类对象,即刚刚创建的动作)。

在交互式会话中设置解析器,并查看每个命令返回的对象是很有帮助的。大多数都具有显示某些属性的基本add_argument方法。与任何Python类对象一样,您可以详细探索属性,甚至可以更改其中一些属性。

str

In [1]: import argparse In [2]: p = argparse.ArgumentParser() In [3]: sp = p.add_subparsers(dest='cmd') 是已创建的所有Action类对象的列表。这里有两个,默认_actions和新创建的子解析器一个。

help

In [4]: p._actions Out[4]: [_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None), _SubParsersAction(option_strings=[], dest='cmd', nargs='A...', const=None, default=None, type=None, choices=OrderedDict(), help=None, metavar=None)] In [5]: type(p._actions[1]) Out[5]: argparse._SubParsersAction 属性现在设置为_subparsers,在这种情况下,第一个默认值是'positionals'。

ArgumentGroup

以及尝试添加其他子解析器所导致的错误(在这种情况下,该错误由In [6]: p._subparsers Out[6]: <argparse._ArgumentGroup at 0x7f3d8ede31d0> In [7]: p._action_groups Out[7]: [<argparse._ArgumentGroup at 0x7f3d8ede31d0>, <argparse._ArgumentGroup at 0x7f3d8ede3cf8>] In [9]: p.print_help() usage: ipython3 [-h] {} ... positional arguments: {} # the subparsers argument optional arguments: -h, --help show this help message and exit 捕获):

ipython