Dependency injection framework for Python
| Files | Last commit | Last update |
|---|---|---|
| 1 year ago | ||
| 1 year ago | ||
| 9 months ago | ||
| 1 year ago | ||
| 9 months ago | ||
| 9 months ago | ||
| 5 years ago | ||
| 1 year ago | ||
| 1 year ago | ||
| 1 year ago | ||
| 2 years ago | ||
| 1 year ago | ||
| 11 months ago | ||
| 3 years ago | ||
| 10 months ago | ||
| 11 months ago | ||
| 1 year ago | ||
| 1 year ago | ||
| 1 year ago | ||
| 11 months ago | ||
| 1 year ago |
.. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/logo.svg :target: https://github.com/ets-labs/python-dependency-injector
|
.. image:: https://img.shields.io/pypi/v/dependency_injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: 最新版本
.. image:: https://img.shields.io/pypi/l/dependency_injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: 许可
.. image:: https://img.shields.io/pypi/pyversions/dependency_injector.svg :target: https://pypi.org/project/dependency_injector/ :alt: 支持的 Python 版本
.. image:: https://img.shields.io/pypi/implementation/dependency_injector.svg :target: https://pypi.org/project/dependency_injector/ :alt: 支持的 Python 实现
.. image:: https://pepy.tech/badge/dependency-injector :target: https://pepy.tech/project/dependency-injector :alt: 下载次数
.. image:: https://pepy.tech/badge/dependency-injector/month :target: https://pepy.tech/project/dependency-injector :alt: 月下载次数
.. image:: https://pepy.tech/badge/dependency-injector/week :target: https://pepy.tech/project/dependency-injector :alt: 周下载次数
.. image:: https://img.shields.io/pypi/wheel/dependency-injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: Wheel
.. image:: https://img.shields.io/github/actions/workflow/status/ets-labs/python-dependency-injector/tests-and-linters.yml?branch=master :target: https://github.com/ets-labs/python-dependency-injector/actions :alt: 构建状态
.. image:: https://coveralls.io/repos/github/ets-labs/python-dependency-injector/badge.svg?branch=master :target: https://coveralls.io/github/ets-labs/python-dependency-injector?branch=master :alt: 覆盖率状态
什么是 Dependency Injector?
Dependency Injector 是一个用于 Python 的依赖注入框架。
它帮助实现依赖注入原则。
Dependency Injector 的主要特性:
- 提供者 (Providers)。提供
Factory、Singleton、Callable、Coroutine、Object,List、Dict、Configuration、Resource、Dependency和Selector提供者, 帮助组装您的对象。详见 提供者文档。 - 覆盖 (Overriding)。可以实时将任何提供者覆盖为另一个提供者。这有助于测试和配置开发/预发布环境,例如用存根替换 API 客户端等。详见 提供者覆盖文档。
- 配置 (Configuration)。从
yaml、ini、json文件、pydantic设置、环境变量和字典中读取配置。 详见 配置提供者文档。 - 资源 (Resources)。帮助初始化和配置日志、事件循环、线程或进程池等。可以与布线配合用于函数执行范围。 详见 资源提供者文档。
- 容器 (Containers)。提供声明式和动态容器。 详见 容器文档。
- 布线 (Wiring)。注入函数和方法的依赖。有助于与其他框架(如 Django、Flask、Aiohttp、Sanic、FastAPI 等)集成。 详见 布线文档。
- 异步 (Asynchronous)。支持异步注入。 详见 异步注入文档。
- 类型标注 (Typing)。提供类型标注,对
mypy友好。 详见 类型标注和 mypy 文档。 - 性能 (Performance)。高效。使用
Cython编写。 - 成熟度 (Maturity)。成熟且生产就绪。经过充分测试、文档齐全且得到支持。
.. code-block:: python
from dependency_injector import containers, providers from dependency_injector.wiring import Provide, inject
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
api_client = providers.Singleton(
ApiClient,
api_key=config.api_key,
timeout=config.timeout,
)
service = providers.Factory(
Service,
api_client=api_client,
)
@inject def main(service: Service = Provide[Container.service]) -> None: ...
if name == "main": container = Container() container.config.api_key.from_env("API_KEY", required=True) container.config.timeout.from_env("TIMEOUT", as_=int, default=5) container.wire(modules=[name])
main() # <-- 依赖被自动注入
with container.api_client.override(mock.Mock()):
main() # <-- 覆盖的依赖被自动注入
当您调用 main() 函数时,Service 依赖会被自动组装并注入。
当您进行测试时,调用 container.api_client.override() 方法将实际的 API 客户端替换为模拟对象。当您调用 main() 时,模拟对象会被注入。
您可以覆盖任何提供者。
它还帮助您在重新配置项目以适应不同环境时:在开发或预发布环境中用存根替换 API 客户端。
使用 Dependency Injector,对象的组装被集中在一个容器中。依赖注入显式定义。
这使得理解和更改应用程序的工作原理变得更加容易。
.. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/di-readme.svg :target: https://github.com/ets-labs/python-dependency-injector
访问文档了解更多关于 Python 中的依赖注入和控制反转。
安装
该包可在 PyPi_ 上获取::
pip install dependency-injector
文档
文档可在 这里 查看。
示例
选择以下之一:
- 应用程序示例(单个容器)
- 应用程序示例(多个容器)
- 解耦包示例(多个容器)
- Boto3 示例
- Django 示例
- Flask 示例
- Aiohttp 示例
- Sanic 示例
- FastAPI 示例
- FastAPI + Redis 示例
- FastAPI + SQLAlchemy 示例
教程
请选择以下其中一个教程:
概念
该框架遵循 PEP20 (Python 之禅) 原则:
.. code-block:: bash
明确胜于隐晦
您需要明确指定如何组装以及在哪里注入依赖。
框架的力量在于其简洁性。依赖注入器 是一个简单工具,却承载着强大的概念。
常见问题
什么是依赖注入?
- 依赖注入是一种减少耦合、增强内聚性的原则
为什么我应该使用依赖注入?
- 你的代码将变得更加灵活、可测试和清晰 😎
如何开始应用依赖注入?
- 你开始按照依赖注入原则编写代码
- 你在容器中注册所有应用程序组件及其依赖
- 当你需要一个组件时,你指定从哪里注入或从容器中获取
我需要付出什么代价,又能得到什么?
- 你需要明确指定依赖
- 开始于会增加额外的工作
- 随着项目成长,这将得到回报
有问题吗?
- 打开一个 Github Issue
发现了一个错误?
- 打开一个 Github Issue
想提供帮助?
- |star| 在 Github 上为
Dependency Injector点星 - |new| 使用
Dependency Injector开始一个新的项目 - |tell| 向你的朋友介绍
Dependency Injector
想要贡献?
- |fork| 分叉这个项目
- |pull| 向
develop分支打开一个拉取请求
.. _PyPi: https://pypi.org/project/dependency-injector/
.. |star| unicode:: U+2B50 U+FE0F .. 星号标志 .. |new| unicode:: U+1F195 .. 新建标志 .. |tell| unicode:: U+1F4AC .. 告诉标志 .. |fork| unicode:: U+1F500 .. 分叉标志 .. |pull| unicode:: U+2B05 U+FE0F .. 拉取标志