2016-06-07 40 views
2

说我已经定义了一些解析器:如何使argparse解析器也可作为subparsers

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

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

现在我想那些解析器出现subparsers。

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调用做到这一点,但我希望有一个解燥。

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

我问的原因是,我收集了一些我不想跟踪的独立脚本,但我也想通过sub-commands提供一个统一的界面。我想从每个独立脚本中导入解析器,并使它们在统一界面中充当子分析器。

+0

您可以在单独的方法中添加参数,然后重新使用或从该方法派生。 – Muposat

回答

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 

在理论上它可以可以定制为与预定义的解析器一起工作,而不是创建一个新的解析器。这可能会花费我半个小时来调试这种变化。

+0

'父母'完美地工作 - 谢谢! – Owen