依赖注入得益于Python 3.6+中的类型提示
项目描述
auto-init 是一个依赖注入工具,它利用Python 3.6+中的类型提示在Python 3.6+中工作。如果你编写了良好的面向对象代码并且将接口与实现分离,那么你可以从中受益。
简介
你知道吗?如果你在类体中为属性提供了一个类型提示但没有设置值,那么这个属性实际上并没有初始化(既不在类中,也不在实例中)?
class Point:
x: int
y: int
z: int = None
对于 p,Point 的一个实例,只有 p.z 被设置。这很好,因为我们可以在这个基础上构建一个依赖注入机制!
简单示例
from auto_init import AutoInitContext
ctx = AutoInitContext()
p: Point = ctx.get_instance(Point)
assert p.x == 0
assert p.y == 0
assert p.z is None
请注意,Point 类也可以是数据类,并且它也可以正常工作。
不那么简单的示例
import logging
from auto_init import AutoInitContext
class Worker:
enterprise: "Enterprise"
log: logging.Logger
class Reporter:
enterprise: "Enterprise"
log: logging.Logger
class Enterprise:
worker: Worker
reporter: Reporter
ctx = AutoInitContext()
ctx.register_instance(logging.getLogger(__name__))
ctx.register_singleton(Enterprise)
enterprise: Enterprise = ctx.get_instance(Enterprise)
assert enterprise.worker.log is enterprise.reporter.log
assert enterprise.worker.enterprise is enterprise
assert enterprise.reporter.enterprise is enterprise
安装
pip install auto-init
API
- AutoInitContext()
创建一个新的自动初始化上下文。
- register_singleton(instance_type: Type, factory: Callable=None)
注册单例类型。这与 register_instance 不同,因为在注册单例实例时,此处 auto-init 负责创建以及初始化单例实例。当单例本身需要依赖项注入时,应使用此方法。请参阅 enterprise.py 示例,位于 auto_init/examples/ 目录下。如果没有提供 factory,则使用 instance_type 来创建实例。
- register_factory(instance_type: Type, factory: Callable)
注册一个可调用函数,当需要请求指定类型的新实例时被调用。
- register_instance(instance, instance_type: Type=None)
注册一个实例,当请求指定类型的实例时总是返回。
- get_instance(instance_type: Type) -> Any
获取指定类型的实例。
- init_instance(instance)
初始化实例的任何未初始化属性。
变更日志
v0.0.5
支持初始化带有 typing.List 和 typing.Dict 注解的属性为空列表或字典。其他 typing.* 注解的属性初始化为 None。
不要尝试从 typing.* 类中获取类型提示,这会在 Python 3.7 中引发异常,并且在 Python 3.6 中也不返回任何有用的信息。
修复了 Python 3.6 的依赖项,移除了 Python 3.7 中不必要的 contextvars 和 dataclasses 依赖项。
Travis CI 配置。
v0.0.4
为了处理循环引用,进行了完整的重写。侵入式方法不好。
类型提示中的前向引用在 Python 3.7 中实际上不起作用,即使有 futures。让我们使用 Python 3.6。
v0.0.3
添加了 AutoInitContext.explicit_only – 允许将上下文标记为仅初始化具有指定提供者的类型,而其他所有类型保持 不变。
如果类型提示包含默认值(声明类属性),则相应的实例属性将是类属性的引用副本,除非在上下文中明确指定了提供者。这意味着 x: int = None 将初始化为 None,而不是 0。
v0.0.2
非侵入式自动初始化:函数 auto_init 和方法 AutoInitContext.auto_init,它初始化实例而不更改用户的类。
添加了 AutoInitContext.singleton_types – 允许非侵入式地指定单例类型。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。