依赖注入工具包
项目描述
di
: 依赖注入工具包
di
是一个现代的依赖注入工具包,模仿了FastAPI的依赖注入的简洁性。
主要功能
- 直观:简单的API,灵感来自FastAPI。
- 自动装配:
di
支持使用类型注解进行自动装配。 - 作用域:受pytest作用域的启发,但由用户定义(没有固定的“请求”或“会话”作用域)。
- 可组合:解耦的内部API为您提供了定制连接、执行和绑定的灵活性。
- 高效:
di
可以并行执行依赖项并缓存结果。性能关键部分是用 🦀 通过 graphlib2 编写的。
安装
pip install di[anyio]
⚠️ 此项目仍在开发中。在 1.X.Y 版本发布之前,请预期会有破坏性变更。⚠️
简单示例
以下是一个展示 di
如何工作的简单示例
from dataclasses import dataclass
from di import Container
from di.dependent import Dependent
from di.executors import SyncExecutor
class A:
...
class B:
...
@dataclass
class C:
a: A
b: B
def main():
container = Container()
executor = SyncExecutor()
solved = container.solve(Dependent(C, scope="request"), scopes=["request"])
with container.enter_scope("request") as state:
c = solved.execute_sync(executor=executor, state=state)
assert isinstance(c, C)
assert isinstance(c.a, A)
assert isinstance(c.b, B)
更多示例,请参阅我们的 文档。
为什么我需要在 Python 中使用依赖注入?那不是 Java 的事情吗?
依赖注入是一种软件架构技术,有助于我们实现 控制反转 和 依赖倒置(SOLID 五大设计原则之一)。
人们普遍认为,传统的软件开发原则不适用于 Python。实际上,你可能已经在使用很多这些技术了!
例如,httpx 的 Client 的 transport
参数(文档)是依赖注入的一个绝佳示例。Pytest,可以说是最受欢迎的 Python 测试框架,以 pytest fixtures 的形式使用依赖注入。
大多数 Web 框架都采用了控制反转:当你定义视图/控制器时,Web 框架会调用你!这同样适用于 CLI(如 click)或 TUI(如 Textual)。这对许多新 Web 框架尤其如此,这些框架不仅使用控制反转,还使用依赖注入。两个很好的例子是 FastAPI 和 BlackSheep。
有关与依赖注入相关的 Python 项目的更全面概述,请参阅 Awesome Dependency Injection in Python。
项目目标
本项目旨在成为一个依赖注入工具包,重点关注为其他库提供底层依赖注入功能。
换句话说,虽然您可以将此作为独立的依赖注入框架使用,但您可能会发现它有些简略且冗长。还有许多更成熟的独立依赖注入框架;我建议至少了解一下 python-dependency-injector,因为它是目前最受欢迎/最广泛使用的之一。
有关更多背景信息,请参阅我们的 文档。
在 GitHub 上查看此版本: v0.79.2
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。