2013-05-20 27 views
1

我試圖在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之間共享信息的正確方法。較新的蟒蛇,所以想知道如果我失去了一些東西。你們怎麼設計你的插件模型?謝謝!

+1

你可能會檢查出現有的替代品,尤其是web框架,它們通常會提供鉤子。在具體任務方面,['argparse'模塊](http://docs.python.org/2.7/library/argparse.html)允許您處理參數並提供有用的幫助功能(甚至允許您創建子分析器以近似像git的東西)。它甚至會讓你得到很好的格式化輸出。你的軟件包究竟會做什麼,而不是? –

+0

已經在使用ArgumentParser - 這不是問題。也沒有使用框架 - 這是框架。如果有幫助,我可以在問題中提供更多信息。我的問題基本上是關於如何以一種也是高性能的方式封裝元數據。我們所談論的「幫助」並不僅僅是「用法」 - 它爲某些任務提供了幫助頁面。關鍵是任務必須自己包含這個元數據,至少在任務類所在的文件中。 – Will

+1

對不起,我的具體意思是你可能會檢查其他框架如何處理插件,但我想不出多少處理那麼多隻需導入它們的插件就很困難。 –

回答

2

我不知道我完全理解你的問題,但我認爲要求

我們必須有效地掃描目錄,進口,負載和實例每個任務只是調用getHelp()

顯然不正確。例如,爲了獲得靜態編譯時數據,一個類不需要實例化(重)。加載器速度非常快,尤其是在預解析的.pyc文件中工作時。

我在想一個例子,但值得注意的是,

import Task 
import TestTask 
print(TestTask.description) 

相對幾乎在瞬間應該是

tt = TestTask() 
print(tt.get_help()) 

因爲沒有實例需要在前者中創建。

加入例如

我使用的含112K源極線作爲導入速度測試194個模塊Python標準庫。刪節的代碼是:

import abc 
import aifc 
import anydbm 
import argparse 
import ast 
… 
import webbrowser 
import whichdb 
import xdrlib 
import xmllib 
import xmlrpclib 
import zipfile 
print(tty.setraw.__doc__) 

在我的動力不足的筆記本電腦上運行230毫秒。 __doc__屬性是在導入時綁定到名稱的函數docstring,即使從預解析的.pyc文件加載時也是如此。

+0

對,我喜歡在靜態環境下這樣做的想法。但我也需要無縫地從動態環境中做同樣的事情。我可以在實例環境中輕鬆使用類方法嗎?我也被你最後一句話弄糊塗了。當tt = TestTask()創建一個實例時,如何不需要實例? – Will

+1

@ msw表示您可以在不實例化的情況下訪問某個類的屬性,並且與第二個示例相比,第一個示例要快得多(因爲它不需要實例化一個類)。 –

+0

啊是啊,「後者」困惑我:) – Will