声明:
本博客欢迎转发,但请保留原作者信息!
新浪微博:@孔令贤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
一种更加通用的使用方式。
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对象
关系图:
详见:http://stevedore.readthedocs.org/en/latest/tutorial/index.html