简单的插件系统
项目描述
extensions 是一个简单的插件系统,灵感来源于setuptools入口点 [1]。它允许应用程序定义和使用插件。
反馈: tarek@ziade.org
如何定义一个插件
插件可以是任何可调用的对象。它必须通过 extensions 注册来注册。
例如,让我们以一个简单的函数为例,该函数计算一些数字的平均值,并将其保存在一个名为 extensions.py 的文件中,该文件位于名为 myapp 的包中
def average(*args): return sum(args) / len(args)
此函数可以使用 register 函数注册到插件系统中。插件有一个 名称 并属于一个 组。在我们的例子中,组可以是 myapp.operator,名称为 average
from extensions import register # usage : register(group, name, location) register('myapp.operator', 'average', 'myapp.extensions:average')
第三个参数给出了可调用的位置,形式为 module_name:attrs,其中 module_name 是模块的全名,attrs 是模块中的属性。
请注意,组名包含包名,这是一个良好的实践,可以避免冲突,因为组名对所有使用 extensions 的应用程序都是全局的。
使用配置文件
还有另一种方法可以通过配置文件注册插件。您可以编写一个类似于ini的文件,使用组作为节标题,使用 name = location 作为值。
例如,如果您创建一个包含以下内容的 operators.cfg 文件
[myapp.operator] average = myapp.extensions:average
您将能够使用 register_file 加载它
from extensions import register_file register_file('operators.cfg')
此函数将扫描您的文件并为您注册插件。
如何使用一个插件
遍历已注册的插件
extensions 提供了一个 get 函数,允许您遍历特定组的所有已注册插件
from extensions import get for plugin in get(group='myapp.operator'): print plugin.name
您也可以将 name 传递给该函数
for plugin in get(group='myapp.operator', name='average'): print plugin.name
或者遍历 所有 插件
from itertools import islice for plugin in islice(get(), 5): print plugin.name
插件对象
get 函数返回的对象是 Plugin 类的实例。
Plugin 类提供了一个名为 load 的方法,该方法返回已注册的对象,因此您可以使用它
# let's get the plugin `average` of the group `myapp.operator` plugin = get(group='myapp.operator', name='average').next() # let's load it func = plugin.load() # let's use it now average = func(1, 2, 3)
插件还提供了一个 name 和一个 group 属性,分别对应注册插件的 name 和其 group。
分发你的插件
如果您想分发您的插件,只需将注册插件的模块导入到您的 setup.py 文件中
from distutils.core import setup from myapp import plugins # registers the plugins setup(name='myapp', version='1.0' packages=['myapp'])
这将通过在安装包时创建一个名为 PLUGINS 的特殊文件,将其放置在安装您的包时创建的 .egg-info 目录中,来注册插件。
与setuptools入口点的兼容性
extensions 与 setuptools 入口点完全兼容。因此,您可以使用安装到 Python 中的第三方应用程序中定义的入口点进行迭代和使用。
如果您想遍历 setuptools 入口点,请在调用 get 函数时使用 consume_entry_points 选项。
plugins = get(consume_entry_points=True)
这将遍历 extensions 插件和 setuptools 入口点。
参考
项目详情
extensions-0.4.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 02a6c12973f527fd09adad71792a8d70dfc94cb49fca67ceb201a4dfa5b18099 |
|
MD5 | e498fe6da146aefb677c3e8a210fbb29 |
|
BLAKE2b-256 | 6299562284766394d99c8559385940e703bc4e984ccbc00dc909cffb3c0bba00 |