使用dependency-injector无法读取configuration.yaml参数的问题排查
问题
无法加载configuration.yaml中的参数,相关代码及报错如下:
containers.py
class Container(containers.DeclarativeContainer): config = providers.Configuration(yaml_files=None) match_worker = providers.Singleton(Admin, key=config.key) def initialize(config_path: Optional[str] = None) -> Container: container = Container() if config_path: container.config.from_yaml(config_path, required=True) return container
notebook.py
from myNotebook.containers import initialize container = initialize('../../configuration.yaml') container.config()
admin.py
from dependency_injector.wiring import inject, Provide class Admin: @inject def __init__( self, key: str, config: dict = Provide["config"] ): self._key: str = key self._config = config def _retrieve(self) -> str: a = self._config() print(a) print(a.stage())
运行后第一个打印输出:
<dependency_injector.wiring.Provide object at 0x7f62d62574f0>
第二个打印触发错误:
AttributeError: 'Provide' object has no attribute 'stage'
作为dependency-injector新手,尝试多种方式访问参数均无效,该如何解决?
解决方法
1. 修正Admin类的注入逻辑
Provide["config"]只是依赖注入的标记,并非实际的配置实例。修改admin.py,明确指定要注入的容器配置,并直接使用配置属性:
from dependency_injector.wiring import inject, Provide from myNotebook.containers import Container class Admin: @inject def __init__( self, key: str, config: providers.Configuration = Provide[Container.config] ): self._key: str = key self._config = config # 此时config是已加载的Configuration实例 def _retrieve(self) -> str: print(self._config) print(self._config.stage) # 直接访问配置属性,无需加括号
2. 激活容器的wiring机制
在notebook.py中,必须调用wire()方法才能让Provide标记替换为实际实例:
from myNotebook.containers import initialize container = initialize('../../configuration.yaml') container.wire(modules=[__name__]) # 激活依赖注入 # 获取Admin实例并调用方法 admin = container.match_worker() admin._retrieve()
3. 正确访问容器配置
container.config本身就是配置实例,无需加括号调用,直接访问属性即可:
# notebook.py中查看配置示例 print(container.config.stage)
4. 校验yaml文件格式
确保configuration.yaml格式正确,示例如下:
key: "your_admin_key" stage: "development"
内容的提问来源于stack exchange,提问作者pymat
相关产品推荐
相关产品推荐

