2016-06-07 21 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