python控制框架的反转

epox的Python项目详细描述


Build Status

环氧树脂

简介

epoxy是python应用程序的控制框架的一个反转 与一组适配器一起打包,这些适配器可以与 现有技术。环氧树脂可以让你清楚地分离出 从定义依赖关系到组件的映射 组件。

对于小型应用程序(如下面的示例),环氧树脂可能是杀伤力过高的,但是 显示了它在大型项目中的真正价值,其中 灵活性和低耦合度是可取的。

许可证

此库在MPL的条款下可用。请看 有关详细信息的许可证文件。

示例

下面是环氧化合物的一个例子:

from epoxy.component import Component, Dependency

class PrinterComponent(Component):

    prefix = StringSetting(required=False, default="PRINTING")

    def print(self, stuff):
        print ("[%s] %%s" % self.prefix) % stuff

    def start(self):
        print self.print("Warming up printer")


class ScreenRenderer(Component):

    printer = Dependency()

    def render_screen(self):
        self.printer.print("My Stuff")

    def start(self):
        self.printer.print("Screen Renderer Initialized")

在本例中,屏幕渲染器不需要知道 打印机将在运行时用作依赖项,它只需要 声明依赖项并使用它(有一个假定的接口,如 在python中,我们只使用duck类型)。

为了在运行时连接这些组件,我们将编写一个yaml文件 会有这样的东西:

components:
  printer:
    class: my.module:PrinterComponent
    settings:
      prefix: PREFIX

  screen_renderer:
    class: my.module:ScreenRenderer
    dependencies:
      printer: printer

entry-point:
  screen_renderer:render_screen

最后,为了加载配置并运行应用程序,我们将 写出如下内容:

from epoxy.configuration import YamlConfigurationLoader
from epoxy.core import ComponentManager

loader = YamlConfigurationLoader("myapp.yml")
config = loader.load_configuration()
component_mgr = ComponentManager()
component_mgr.launch_configuration(config)

这将运行我们的入口点并将以下内容打印到屏幕:

[PREFIX] Warming up printer
[PREFIX] Screen Renderer Initialized
[PREFIX] my stuff

编写组件

编写的任何组件都应遵循以下基本规则 玩得好:

  1. 无参数构造函数:组件在 要由框架实例化的顺序。初始化组件 在您自己的代码中(可能来自单元测试),您可以使用 “from_dependencies”类方法可用于任何组件和过程 在任何相关的依赖项/设置中作为关键字参数。

    例如,实例化前面的对象图 以下内容:

    printer = PrinterComponent.from_dependencies(prefix="FROM_DEPS")
    renderer = ScreenRenderer.from_dependencies(printer=printer)
    

    当执行__init__时,保证所有依赖项 将出现并初始化(但未启动)。

  2. 实现start()方法:在图中的所有对象 实例化后,将启动它们。就像用__init__, 依赖项将存在并已调用start()。 不应阻止对start()的调用。对于长时间运行的任务,使用 入口点更合适。

  3. 避免依赖循环:如果对象图具有依赖关系,则 将在尝试构建依赖关系图时出错 将无法运行您的应用程序。有很多不同的 打破这些循环的策略。如果你遇到这个问题 被剔除,只知道修复这个问题是在制造你的问题 应用更好。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java GridBagLayout不填充区域   java Memozied Fibonacci未运行与常规Fibonacci解决方案   Java Web启动未启动问题   Java中异常和if-then的区别   java从命令提示符运行批处理文件获取错误   socket在Java中验证SSL证书的公共名称   如何在JAVA中检查字符串数组中的相等字   用java语言将音频文件转换成文本文件的语音识别   java为什么foo(1,2,3)没有传递给varargs方法foo(对象…)作为整数[]   java通过蓝牙将奇怪的数据从Arduino传输到Android   java ContainerRequestFilter获取空entitystream   java如何从安卓 studio中删除不兼容类型错误   基本Java错误   在Spring引导中使用REST API时发生java错误   javascript通过从SQL查询派生的URL打开页面