page contents

Python圈新宠?这个“小豆腐” dependency injection库有点意思

别误会,我们说的“找对象”,是程序里的依赖注入。一个名字很萌,实力很猛的 Python 项目

attachments-2025-09-fu0VPULc68d73c67cba26.png别误会,我们说的“找对象”,是程序里的依赖注入。

一个名字很萌,实力很猛的 Python 项目

✅ 类型安全

✅ 零侵入设计

✅ 自动依赖图构建

✅ 工厂模式支持

✅ 日志自动注入

✅ 循环依赖检测……

这哪是“小项目”,分明是给 Python 工程化打了一针强心剂!

什么是“依赖注入”?为啥 Python 需要它?

先别被术语吓到。我们举个接地气的例子:你写了个用户服务 UserService,它要连数据库 Database。传统做法:

db = Database("postgresql://...")

user_service = UserService(db)

但如果整个系统有几十上百个类,层层嵌套,谁创建谁、怎么传参、怎么测试?很快就会变成一团乱麻。而依赖注入(DI) 的思路是:你只管声明“我需要什么”,框架自动帮你“把对象送上门”。就像点外卖:你说:“我要一份黄焖鸡米饭”,平台自动安排厨师、打包、骑手,你不用关心后厨怎么运作。

这就是 izumi-chibi-py 想干的事。

它到底有多“智能”?看几个骚操作

1. 对象不用 new,框架自动“送上门”

class UserService:

    def __init__(self, database: Database):  # 我只要Database,别的不管

        self.database = database

你只需要标注类型,剩下的事——创建顺序、依赖关系、生命周期管理——全由框架搞定。

2. 日志都不用手动初始化,自动“贴身配送”

def __init__(self, logger: logging.Logger):

    self.logger = logger  # 直接拿到 __main__.UserService 的专属logger

连日志命名都按类路径自动生成,再也不用写 logging.getLogger(__name__) 了。

3. 支持“多选一”配置,轻松切换环境

想开发用 SQLite,生产用 PostgreSQL?没问题!

module.make(Database).using().type(PostgresDatabase)  # 生产

# 或者

module.make(Database).using().type(SqliteDatabase)   # 开发

甚至可以通过“激活轴”动态控制,像开关一样切换实现。

4. 工厂模式一键生成,对象随用随取

有些对象不能单例化(比如用户会话),怎么办?

module.make(Factory[UserSession]).using().factory(UserSession)

然后就可以:

session1 = factory.create("user1")

session2 = factory.create("user2")

框架自动注入 Database,你只需传运行时参数,真正实现“半自动构造”。

最惊艳的功能:自动检测“死循环”和“缺胳膊少腿”

我们知道,依赖太多容易出问题,比如:

A 依赖 B,B 又依赖 A → 循环依赖

声明要一个 RedisClient,结果没人提供 → 缺失依赖

而 izumi-chibi-py 在启动时就会扫描整个依赖图,提前报错:

❌ Circular dependency detected: UserService -> Database -> Config -> UserService

❌ Missing binding for: RedisClient

这相当于给你装了个“代码 CT 机”,还没运行就知道哪里会炸

实战演示:三步搭建一个 DI 系统

第一步:定义模块

from izumi.distage import ModuleDef

module = ModuleDef()

module.make(str).using().value("postgresql://localhost:5432/app")

module.make(Database).using().type(Database)

module.make(UserService).using().type(UserService)

第二步:创建注入器

from izumi.distage import Injector, PlannerInput

injector = Injector()

planner_input = PlannerInput([module])

第三步:直接拿服务

user_service = injector.get(planner_input, UserService)

result = user_service.create_user("张三")

print(result)

# 输出:DB[postgresql://...]: INSERT INTO users (name) VALUES ('张三')

全程无 new、无硬编码、无手动传递,干净得像首诗。

现在能用吗?会不会翻车?

作者自己说了:“Expect dragons, landmines and varying mileage.”

(准备好迎接巨龙、地雷和各种翻车现场)

目前项目刚起步,没有经过大规模生产验证。但它有几个优势让人无法忽视:

核心理念来自成熟的 Scala distage 项目

使用现代 Python 类型系统,类型安全拉满

API 设计优雅,接近“声明式编程”

CI/CD、测试覆盖率、PyPI 发布一条龙齐全

适合想尝鲜的架构师、追求工程化的团队技术负责人,或者单纯想学点高级玩意儿的卷王。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-09-27 09:22
  • 阅读 ( 35 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2224 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2224 文章
  3. Pack 1407 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章