聲明:
本博客歡迎轉發,但請保留原作者信息!
新浪微博:@孔令賢HW;
博客地址:http://blog.csdn.net/lynn_kong
內容系本人學習、研究和總結,如有雷同,實屬榮幸!
stevedore基於setuptools entry point(http://packages.python.org/distribute/pkg_resources.html#convenience-api),提供python應用程序管理插件的功能。
一、插件的幾種使用方式
1、Drivers – Single Name, Single Entry Point
即一種插件對應一種外部資源(數據庫,設備或遠程應用程序),同一類資源可能有很多不同的插件,使用時對於某一個特定的資源只能選擇其中一種。
使用示例:
SQLAlchemy(http://sqlalchemy.org/)
libcloud(http://libcloud.apache.org/)
2、Hooks – Single Name, Many Entry Points
這種使用的方式,類似於,一個應用程序觸發了一個事件,需要不同的程序進行處理,同一個namespace中,不同的entrypoint可以使用相同的名稱。
使用示例:
Emacs mode hook functions(http://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html)
Django signals(https://docs.djangoproject.com/en/dev/topics/signals/)
3、Extensions – Many Names, Many Entry Points
一種更加通用的使用方式。
二、stevedore中的類
1、Extension(name, entry_point, plugin, obj)
表示一個entry point,所有傳遞的參數都作爲對象的屬性。
name: entry point的名稱;
entry_point: 從pkg_resources獲得的表示entrypoint的EntryPoint對象;
plugin: entry_point.load()返回的類;
obj: extension被加載時會觸發plugin(*args, **kwds),創建一個plugin的實例;
2、ExtensionManager(namespace, invoke_on_load=False, invoke_args=(),invoke_kwds={}, propagate_map_exceptions=False)
其他所有manager的基類,參數說明:
namespace (str) –entry points的命名空間.
invoke_on_load (bool) – 是否自動加載extension.
invoke_args (tuple) – 自動加載extension時向實例傳遞的參數1.
invoke_kwds (dict) – 自動加載extension實例時傳遞的參數2.
propagate_map_exceptions – 使用map調用時,是否向上傳遞異常信息.
方法:
map(func, *args, **kwds)
對每一個extension觸發func調用,func的寫法:
def func(ext, *args, **kwds):
pass
names()
返回extension的名稱列表
3、EnabledExtensionManager(namespace, check_func, invoke_on_load=False,invoke_args=(), invoke_kwds={}, propagate_map_exceptions=False)
繼承自ExtensionManager,只加載通過check_func校驗的extension
4、DispatchExtensionManager(namespace, check_func,invoke_on_load=False, invoke_args=(), invoke_kwds={},propagate_map_exceptions=False)
繼承自EnabledExtensionManager,擴展了map函數
map(filter_func, func, *args, **kwds)
filter_func與func寫法一樣,只有通過filter_func的extension,才執行func調用。
5、NameDispatchExtensionManager(namespace, check_func,invoke_on_load=False, invoke_args=(), invoke_kwds={},propagate_map_exceptions=False)
繼承自DispatchExtensionManager,修改了map函數
map(names, func, *args, **kwds)
只有名稱在names中的extension,才執行func調用。
6、NamedExtensionManager (namespace, names, invoke_on_load=False,invoke_args=(), invoke_kwds={}, name_order=False,propagate_map_exceptions=False)
繼承自ExtensionManager,只加載名稱在names內的extension。
7、HookManager(namespace, name, invoke_on_load=False, invoke_args=(),invoke_kwds={})
繼承自NamedExtensionManager,加載相同的名稱的extensions
8、DriverManager(namespace, name, invoke_on_load=False, invoke_args=(),invoke_kwds={})
繼承自NamedExtensionManager,加載名稱等於name的一個extension。
__call__(func, *args, **kwds)
driver:返回driver對象
關係圖:
三、stevedore的使用
詳見:http://stevedore.readthedocs.org/en/latest/tutorial/index.html