如何使 argparse 解析器也用作子解析器

How to make argparse parsers also function as subparsers

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

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 提供一个统一的界面。我想从每个独立脚本中导入解析器,并使它们在统一界面中充当子解析器。

你试过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

理论上,它可以被定制为与您预定义的解析器一起工作,而不是创建一个新的解析器。调试这样的更改可能需要半个小时。