跳转到主要内容

依赖注入得益于Python 3.6+中的类型提示

项目描述

auto-init 是一个依赖注入工具,它利用Python 3.6+中的类型提示在Python 3.6+中工作。如果你编写了良好的面向对象代码并且将接口与实现分离,那么你可以从中受益。

简介

你知道吗?如果你在类体中为属性提供了一个类型提示但没有设置值,那么这个属性实际上并没有初始化(既不在类中,也不在实例中)?

class Point:
    x: int
    y: int
    z: int = None

对于 pPoint 的一个实例,只有 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.Listtyping.Dict 注解的属性为空列表或字典。其他 typing.* 注解的属性初始化为 None

  • 不要尝试从 typing.* 类中获取类型提示,这会在 Python 3.7 中引发异常,并且在 Python 3.6 中也不返回任何有用的信息。

  • 修复了 Python 3.6 的依赖项,移除了 Python 3.7 中不必要的 contextvarsdataclasses 依赖项。

  • 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 – 允许非侵入式地指定单例类型。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

auto-init-0.0.5.tar.gz (6.1 kB 查看散列)

上传时间

构建分布

auto_init-0.0.5-py3-none-any.whl (6.2 kB 查看散列)

上传于 Python 3

支持者