我想创建一个函数,它将一个子命令添加到解析器中。
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
,它返回单例。)
答案 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