我正在用Python 2.7模塊的形式構建一個非常基礎的平臺。該模塊具有讀取評估打印循環,其中輸入的用戶命令映射到函數調用。由於我正在試圖爲我的平臺構建插件模塊,所以函數調用將從我的主模塊到任意插件模塊。我希望一個插件生成器能夠指定他想要觸發他的函數的命令,所以我一直在尋找一種Pythonic方法來遠程輸入主模塊中的command-> function dict中的映射插件模塊。在編譯時提供函數元數據的大多數Pythonic方法?
我已經看了幾件事情:
方法名稱解析:主模塊將導入插件模塊 和掃描它匹配某種格式,方法名。例如,對於 示例,它可能會將download_file_command(file)方法作爲「下載文件」 - > download_file_command添加到其 字典中。但是,獲取簡潔易用的命令名稱(例如「dl」)要求功能的名稱也較短,這不利於代碼 的可讀性。它還要求插件開發者符合 的精確命名格式。
跨模塊的裝飾:裝飾會讓 插件開發者的名字,無論他希望他的功能和簡單的 添加類似@ Main.register(「DL」),但他們必然 要求我都修改另一個模塊的名稱空間,並在主模塊中保持全局狀態 。我知道這很糟糕。
相同模塊裝飾:使用與上述相同的邏輯,I可以添加一個 裝飾,其將所述函數的名稱,以一些命令名稱 - >函數映射本地的 插件模塊和檢索映射到主要模塊與 API調用。這要求某些方法總是存在或者繼承,但是 - 如果我對裝飾器的理解是正確的 - 函數只會在第一次運行時自行註冊,並且在隨後的其後 之後將不必要地重新註冊自身。
因此,我真正需要的是與註釋應觸發它的命令名稱的功能Python化的方式,並且這種方式不能是函數的名稱。當我導入模塊時,我需要能夠提取命令名 - >函數映射,並且在插件開發人員方面減少工作量是一大優勢。
感謝您的幫助,如果我的Python理解存在任何缺陷,我表示歉意。我對這門語言比較陌生。
只是檢查你意識到這一點,但裝修(和函數定義)在運行時執行,Python做在編譯時的唯一的事情就是編譯代碼。 – Duncan 2013-02-12 09:55:17
方法2沒有任何問題。讓他們執行類似'import plugin'的操作並執行'@ plugin.register('my_method_name')\ ndef somefunc_meeting_an_api_spec():...' – 2013-02-12 09:57:08
您可能想看看[plac](http://pypi.python.org/pypi/plac)就是這樣做的。 – georg 2013-02-12 09:59:30