python-dependency-injector:Python依赖注入框架,助力实现依赖注入原则

Dependency injection framework for Python

Branch289Tags343
FilesLast commitLast 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)。提供 FactorySingletonCallableCoroutineObject, ListDictConfigurationResourceDependencySelector 提供者, 帮助组装您的对象。详见 提供者文档
  • 覆盖 (Overriding)。可以实时将任何提供者覆盖为另一个提供者。这有助于测试和配置开发/预发布环境,例如用存根替换 API 客户端等。详见 提供者覆盖文档
  • 配置 (Configuration)。从 yamlinijson 文件、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

文档

文档可在 这里 查看。

示例

选择以下之一:

教程

请选择以下其中一个教程:

概念

该框架遵循 PEP20 (Python 之禅) 原则:

.. code-block:: bash

明确胜于隐晦

您需要明确指定如何组装以及在哪里注入依赖。

框架的力量在于其简洁性。依赖注入器 是一个简单工具,却承载着强大的概念。

常见问题

什么是依赖注入?

  • 依赖注入是一种减少耦合、增强内聚性的原则

为什么我应该使用依赖注入?

  • 你的代码将变得更加灵活、可测试和清晰 😎

如何开始应用依赖注入?

  • 你开始按照依赖注入原则编写代码
  • 你在容器中注册所有应用程序组件及其依赖
  • 当你需要一个组件时,你指定从哪里注入或从容器中获取

我需要付出什么代价,又能得到什么?

  • 你需要明确指定依赖
  • 开始于会增加额外的工作
  • 随着项目成长,这将得到回报

有问题吗?

发现了一个错误?

想提供帮助?

  • |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 .. 拉取标志