RSS Python星球 关注 Eli Bendersky:插件案例研究:Pluggy Pluggy 是一个用于在工具和库中构建插件系统的 Python 库。它最初是为 pytest 项目开发的,随后被提取为独立的库。Pluggy 的核心概念围绕钩子(hooks)展开,这些钩子由宿主应用程序暴露,并由插件实现。宿主使用 HookspecMarker 定义钩子,而插件则使用 HookimplMarker 实现它们。该库还用于创建一个名为 htmlize 的示例工具,该工具可将标记转换为 HTML,并通过插件支持自定义角色和内容处理。宿主定义特定的钩子(如 htmlize_role_handler 和 htmlize_contents),以便插件扩展其功能。这些钩子可接受多种参数,并返回用于处理数据的函数。Pluggy 的 PluginManager 负责加载插件,并提供一种便捷的机制来发现注册为 setuptools 入口点(entry points)的插件。这使得通过 pip 安装的插件能够被宿主应用程序自动发现和加载。宿主也可以使用自定义的插件发现方法,直接将插件注册到管理器中。调用已加载的插件十分简单;PluginManager 协调对已注册钩子实现的调用。钩子调用通常返回所有已附加插件的结果列表,并提供选项以控制执行顺序。插件通过用宿主的 hookimpl 标记装饰其函数来实现钩子。Pluggy 与基本的插件概念(如发现、注册和钩子的使用)高度契合。它提供了一种符合 Python 风格的方式,将宿主 API 暴露给插件,并利用标准的 Python 导入机制。虽然构建插件系统可能很简单,但 Pluggy 提供了高级功能,如签名验证、一致的结果收集以及排序选项。是否使用 Pluggy 取决于项目需求,需权衡其高级功能的优势与引入依赖的代价。该库自动注册入口点的机制对于使用标准 Python 打包工具的项目尤为有用。总体而言,Pluggy 为构建可扩展的 Python 应用程序提供了一种强大且灵活的解决方案。 Eli Bendersky: Plugins case study: Pluggy eli.thegreenplace.net
HookspecMarker定义钩子,而插件则使用HookimplMarker实现它们。该库还用于创建一个名为 htmlize 的示例工具,该工具可将标记转换为 HTML,并通过插件支持自定义角色和内容处理。宿主定义特定的钩子(如htmlize_role_handler和htmlize_contents),以便插件扩展其功能。这些钩子可接受多种参数,并返回用于处理数据的函数。Pluggy 的PluginManager负责加载插件,并提供一种便捷的机制来发现注册为 setuptools 入口点(entry points)的插件。这使得通过 pip 安装的插件能够被宿主应用程序自动发现和加载。宿主也可以使用自定义的插件发现方法,直接将插件注册到管理器中。调用已加载的插件十分简单;PluginManager协调对已注册钩子实现的调用。钩子调用通常返回所有已附加插件的结果列表,并提供选项以控制执行顺序。插件通过用宿主的hookimpl标记装饰其函数来实现钩子。Pluggy 与基本的插件概念(如发现、注册和钩子的使用)高度契合。它提供了一种符合 Python 风格的方式,将宿主 API 暴露给插件,并利用标准的 Python 导入机制。虽然构建插件系统可能很简单,但 Pluggy 提供了高级功能,如签名验证、一致的结果收集以及排序选项。是否使用 Pluggy 取决于项目需求,需权衡其高级功能的优势与引入依赖的代价。该库自动注册入口点的机制对于使用标准 Python 打包工具的项目尤为有用。总体而言,Pluggy 为构建可扩展的 Python 应用程序提供了一种强大且灵活的解决方案。