如何在带有argparse的单独命名空间中使用子解析器参数?


问题内容

我有以下测试代码

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", default = 0, type=int)

subparsers = parser.add_subparsers(dest = "parser_name")

parser_lan = subparsers.add_parser('car')
parser_lan.add_argument("--boo")
parser_lan.add_argument("--foo")

parser_serial = subparsers.add_parser('bus')
parser_serial.add_argument("--fun")

print parser.parse_args()

它定义了两个具有不同参数集的子解析器。当我将测试代码称为

tester.py  --verbose 3 car --boo 1 --foo 2

我得到了预期的结果

Namespace(boo='1', foo='2', parser_name='car', verbose=3)

我要拥有的是来自单独子命名空间或dict中每个子解析器的值,例如

Namespace(subparseargs={boo:'1', foo:'2'}, parser_name='car', verbose=3)

因此每个子解析器的参数与主解析器的参数在逻辑上是分开的(如verbose本例所示)。

如何使用 同一 名称空间subparseargs中的每个子解析器的参数来实现此目的(在示例中)。


问题答案:

我已经开始开发一种不同的方法(但与Anthon的建议相似),并且想出了一个短得多的代码。但是,我不确定我的方法是否可以解决该问题。

与Anthon提出的类似,我定义了一个新方法,该方法创建保留在中的“顶级”参数列表args,而所有其他参数作为附加字典返回:

class MyArgumentParser(argparse.ArgumentParser):
    def parse_subargs(self, *args, **kw):
        # parse as usual
        args = argparse.ArgumentParser.parse_args(self, *args, **kw)

        # extract the destination names for top-level arguments
        topdest = [action.dest for action in parser._actions]

        # loop over all arguments given in args
        subargs = {}
        for key, value in args.__dict__.items():

            # if sub-parser argument found ...
            if key not in topdest:

                # ... remove from args and add to dictionary
                delattr(args,key)
                subargs[key] = value

        return args, subargs

欢迎对此方法发表评论,尤其是我忽略的任何漏洞。