You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:30:35