python控制框架的反转
epox的Python项目详细描述
环氧树脂
简介
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
编写组件
编写的任何组件都应遵循以下基本规则 玩得好:
无参数构造函数:组件在 要由框架实例化的顺序。初始化组件 在您自己的代码中(可能来自单元测试),您可以使用 “from_dependencies”类方法可用于任何组件和过程 在任何相关的依赖项/设置中作为关键字参数。
例如,实例化前面的对象图 以下内容:
printer = PrinterComponent.from_dependencies(prefix="FROM_DEPS") renderer = ScreenRenderer.from_dependencies(printer=printer)
当执行__init__时,保证所有依赖项 将出现并初始化(但未启动)。
实现start()方法:在图中的所有对象 实例化后,将启动它们。就像用__init__, 依赖项将存在并已调用start()。 不应阻止对start()的调用。对于长时间运行的任务,使用 入口点更合适。
避免依赖循环:如果对象图具有依赖关系,则 将在尝试构建依赖关系图时出错 将无法运行您的应用程序。有很多不同的 打破这些循环的策略。如果你遇到这个问题 被剔除,只知道修复这个问题是在制造你的问题 应用更好。