Python的dependency_injector包wiring功能未按预期运行,如何解决?
问题原因
这是使用方式错误导致的问题,不属于依赖注入包的bug,核心错误点有3个:
- 容器执行wire绑定扫描时,没有将运行
main函数的main.py模块加入扫描列表,导致@inject装饰器无法解析main函数内的Provide标记,参数直接使用了默认的Provide对象没有被替换为实际注入实例。 - 你在全局作用域和
__main__代码块中重复初始化了两次容器实例,函数参数引用的全局容器实例和最终初始化的实例不是同一个,绑定关系不匹配。 - 目录下的包初始化文件命名错误,你写的
init.py需要改为__init__.py,否则Python无法识别对应目录为合法导入包。
修正方案
1. 调整main.py代码
from dummy_objects.dummy import Dummy from containers.dependencies import get_container, Container from dependency_injector.wiring import inject, Provide @inject def main(dummy1: Dummy = Provide[Container.dummy1]) -> None: dummy2 = Dummy('Test object 1') print(dummy1) print(dummy2) if __name__ == '__main__': container = get_container() # 将当前main模块加入wire扫描列表 container.wire(modules=[__name__]) main()
2. 修正目录命名
将dummy_objects和containers目录下的init.py都重命名为__init__.py。
修改完成后运行即可得到预期输出。
内容的提问来源于stack exchange,提问作者user8627671
相关产品推荐
相关产品推荐

