Skip to content
Open
6 changes: 3 additions & 3 deletions src/dependency_injector/wiring.py
Original file line number Diff line number Diff line change
Expand Up @@ -959,8 +959,8 @@ def __getitem__(self, item) -> Self:
self.segments.append((self.TYPE_ITEM, item))
return self

def call(self) -> Self:
self.segments.append((self.TYPE_CALL, None))
def call(self, *args, **kwargs) -> Self:
self.segments.append((self.TYPE_CALL, (args, kwargs)))
return self

def modify(
Expand All @@ -975,7 +975,7 @@ def modify(
elif type_ == ProvidedInstance.TYPE_ITEM:
provider = provider[value]
elif type_ == ProvidedInstance.TYPE_CALL:
provider = provider.call()
provider = provider.call(*value[0], **value[1])
else:
assert_never(type_)
return provider
Expand Down
4 changes: 3 additions & 1 deletion tests/unit/samples/wiring/container.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from dependency_injector import containers, providers

from .service import Service
from .service import Service, ServiceWithCallable


class SubContainer(containers.DeclarativeContainer):
Expand All @@ -14,4 +14,6 @@ class Container(containers.DeclarativeContainer):

service = providers.Factory(Service)

service_with_callable = providers.Factory(ServiceWithCallable)

sub = providers.Container(SubContainer)
21 changes: 21 additions & 0 deletions tests/unit/samples/wiring/module.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,27 @@ def test_provided_instance(some_value: int = Provide[Container.service.provided.
return some_value


@inject
def test_provided_instance_call_with_args(
some_value: int = Provide[Container.service_with_callable.provided.method_with_args.call(1, 2)]
):
return some_value


@inject
def test_provided_instance_call_with_kwargs(
some_value: dict = Provide[Container.service_with_callable.provided.method_with_kwargs.call(a=1, b=2)]
):
return some_value


@inject
def test_provided_instance_call_with_args_and_kwargs(
some_value: dict = Provide[Container.service_with_callable.provided.foo.process.call(1, 2, key="value")]
):
return some_value


@inject
def test_subcontainer_provider(some_value: int = Provide[Container.sub.int_object]):
return some_value
Expand Down
13 changes: 13 additions & 0 deletions tests/unit/samples/wiring/service.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,15 @@
class Service:
service_attr: int


class ServiceWithCallable:
def __init__(self):
self.foo = CallableDict({"bar": lambda: 10})
self.method_with_args = lambda x, y: x + y
self.method_with_kwargs = lambda **kwargs: kwargs


class CallableDict(dict):
def __init__(self, data):
super().__init__(data)
self.process = lambda *args, **kwargs: {"args": args, "kwargs": kwargs}
15 changes: 15 additions & 0 deletions tests/unit/wiring/provider_ids/test_main_py36.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,21 @@ class TestService:
assert some_value == 10


def test_provided_instance_call_with_args():
some_value = module.test_provided_instance_call_with_args()
assert some_value == 3


def test_provided_instance_call_with_kwargs():
some_value = module.test_provided_instance_call_with_kwargs()
assert some_value == {"a": 1, "b": 2}


def test_provided_instance_call_with_args_and_kwargs():
some_value = module.test_provided_instance_call_with_args_and_kwargs()
assert some_value == {"args": (1, 2), "kwargs": {"key": "value"}}


def test_subcontainer():
some_value = module.test_subcontainer_provider()
assert some_value == 1
Expand Down