我試圖在Python(2.7)中設計一個易於擴展/模塊化的命令行應用程序。每個模塊都稱爲「任務」。每個文件有一個任務,包含在任務/目錄中,每個任務包含Task
的子類和包含給定任務的代碼入口點的run()
方法。因爲我希望每個「任務文件」都包含將任務註冊到系統中所需的所有內容。每個任務都包含諸如幫助,可用參數,身份驗證信息,類別等元數據。這些不僅僅是靜態屬性 - 例如,幫助系統使用Template
來代替幫助文本中的$variable
。基於類的「任務」模塊的良好模式?
下面是一些示例代碼:
class TestTask(Task):
description = "This task prints 'Hello world...' and exits."
help = "Usage: $argv0 $task ...\n ..."
def __init__(self, arguments=None):
super(TestTask, self).__init__(description=self.description, arguments=arguments, help=self.help)
def run(self):
print("Hello world...")
這樣,那麼,我們如何爲任務顯示幫助?或者獲得所有描述的任務清單?那麼,我們必須有效地掃描目錄,導入,加載和實例化每個任務,只需在其上調用getHelp()
或getDescription()
即可。其中一些任務相當繁重。 「列表任務」的加載時間超過一秒鐘,並且很明顯。我想過緩存它,但似乎是矯枉過正。
什麼是更乾淨/更快的方式來做到這一點?我應該以某種方式緩存任務元數據?我希望這樣做盡可能動態以減輕任務的發展。我想過一個包含元數據的內部類,但不確定。我相信所有任務的import
仍然需要處理,我不清楚在「Meta
」內部類和包含Task
之間共享信息的正確方法。較新的蟒蛇,所以想知道如果我失去了一些東西。你們怎麼設計你的插件模型?謝謝!
你可能會檢查出現有的替代品,尤其是web框架,它們通常會提供鉤子。在具體任務方面,['argparse'模塊](http://docs.python.org/2.7/library/argparse.html)允許您處理參數並提供有用的幫助功能(甚至允許您創建子分析器以近似像git的東西)。它甚至會讓你得到很好的格式化輸出。你的軟件包究竟會做什麼,而不是? –
已經在使用ArgumentParser - 這不是問題。也沒有使用框架 - 這是框架。如果有幫助,我可以在問題中提供更多信息。我的問題基本上是關於如何以一種也是高性能的方式封裝元數據。我們所談論的「幫助」並不僅僅是「用法」 - 它爲某些任務提供了幫助頁面。關鍵是任務必須自己包含這個元數據,至少在任務類所在的文件中。 – Will
對不起,我的具體意思是你可能會檢查其他框架如何處理插件,但我想不出多少處理那麼多隻需導入它們的插件就很困難。 –