说我已经定义了一些解析器:
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提供统一的界面。我想从每个独立脚本中导入解析器,并使它们在统一接口中表现为子解析器。
答案 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
理论上,它可以自定义以与预定义的解析器一起使用,而不是创建新的解析器。调试这样的改变可能需要半个小时。