如何使argparse解析器也作为subparser

时间:2016-06-07 21:23:53

标签: python argparse

说我已经定义了一些解析器:

foo_parser = argparse.ArgumentParser()
foo_parser.add_argument('-f')

bar_parser = argparse.ArgumentParser()
bar_parser.add_argument('-b')

现在我希望这些解析器显示为子解析器。

parser = argparse.ArgumentParser(prog='parent')
subparsers = parser.add_subparsers()

subparsers.add_parser('foo')   # how can I associate these subparsers 
subparsers.add_parser('bar')   # with my foo and bar parsers already defined?

我知道我可以通过重复所有add_argument调用来做到这一点,但我希望能有一个DRY解决方案。

argparse允许这样做,还是我必须重新定义我的子分析符?

我之所以要问的原因是,我有一系列独立的脚本,我不想与之相提并论,但我也希望通过sub-commands提供统一的界面。我想从每个独立脚本中导入解析器,并使它们在统一接口中表现为子解析器。

1 个答案:

答案 0 :(得分:1)

您是否尝试过parents机制?它是一种使用来自另一个解析器的参数(和组)填充新解析器(包括子解析器)的方法。有些人甚至将它用作向多个子分析器添加参数子集的方法。它通过引用复制参数(Action对象)。通常这样做可以,但它限制了自定义参数。

https://docs.python.org/3/library/argparse.html#parents

==================

使用此方法创建子分析器:

class _SubParsersAction(Action):
    def add_parser(self, name, **kwargs):
       ....
       parser = self._parser_class(**kwargs)
       ....
       return parser

理论上,它可以自定义以与预定义的解析器一起使用,而不是创建新的解析器。调试这样的改变可能需要半个小时。