天天看點

python解析器_python-如何從父解析器擷取argparse子解析器(...

你做對了.但是也許我可以解釋一些細節.

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]:

[,

,

]

In [30]: [g.title for g in parser._action_groups]

Out[30]: ['positional arguments', 'optional arguments', 'subparsers']

In [31]: parser._subparsers

Out[31]:

_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類.