Python插件架构:使用多态还是导入钩子?

时间:2015-03-04 23:59:06

标签: plugins architecture module webserver polymorphism

我想在几个外部网站上搜索模式,并希望通用界面输入一次,并在同一视图中收集所有结果。因此,我目前正在构建一个项目,该项目由能够向其他网站发送请求的Web服务器(用于用户界面)组成。

我计划使用 Bottle Flask 来快速启动底层网络服务器功能,并希望采用插件架构

由于我不知道我现在要访问多少个网站,并且由于每个网站的解析方式不同,以及信息量,我希望每个插件添加都需要尽可能少的码。只解析过程。例如,添加要访问的新网站不得要求修改所有数据模型,视图模板等。

所以,我在想一个核心程序向模块发送和接受有限数量的通用函数。 Core的信息类型有限,每个模块都能提供部分或全部类型。

我真正的问题如下:我应该使用OOP 多态 imp 模块( load_source )来使用我的模块吗?

每个模块都可以是一个通用模块类构建的类,或者每个模块可以是独立的,包含核心可用的函数,用 imp.load_source()调用它们。第二个选项让我想到导出DLL函数以将它们与C / C ++程序一起使用。

我一直在阅读this post,非常有趣,我仍然想知道子类是否更好?

感谢您的建议!

1 个答案:

答案 0 :(得分:0)

您的问题实际上由两部分组成:

  1. 找到可用的插件并加载其来源。
  2. 初始化(即配置)并使用您的插件。
  3. "多态性"问题涉及到后来的问题。所以可以同时拥有你建议的内容: 使用imp.load_source来获取可以在稍后使用插件之前配置的多态子类。

    但我会建议第1部分使用"标准" setuptools的机制因为:

    • 加载插件,没有冲突或缺少要求,
    • 即使插件本身具有其他动态依赖关系(为什么限制下游"程序员"单片设计?),
    • 并在安装包并从sys.path插件-dir
    • 中删除时保持可用插件列表更新

    是与语言的打包和分发系统密切相关的任务。 从长远来看,基于分发/包装的解决方案永远是插件的更可靠选择。

    如果您看一下为比较各种插件架构而精心设计的exemplary application,您会注意到所需的代码几乎比其他代码要小,而它可以实现更多。