mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-03-13 08:25:50 +03:00
Fix infinite loop with Closing+ConfigurationOption
This commit is contained in:
parent
57123cebaa
commit
6685c5a141
|
@ -628,21 +628,6 @@ def _fetch_reference_injections( # noqa: C901
|
||||||
return injections, closing
|
return injections, closing
|
||||||
|
|
||||||
|
|
||||||
def _locate_dependent_closing_args(
|
|
||||||
provider: providers.Provider, closing_deps: Dict[str, providers.Provider]
|
|
||||||
) -> Dict[str, providers.Provider]:
|
|
||||||
for arg in [
|
|
||||||
*getattr(provider, "args", []),
|
|
||||||
*getattr(provider, "kwargs", {}).values(),
|
|
||||||
]:
|
|
||||||
if not isinstance(arg, providers.Provider):
|
|
||||||
continue
|
|
||||||
if isinstance(arg, providers.Resource):
|
|
||||||
closing_deps[str(id(arg))] = arg
|
|
||||||
|
|
||||||
_locate_dependent_closing_args(arg, closing_deps)
|
|
||||||
|
|
||||||
|
|
||||||
def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> None:
|
def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> None:
|
||||||
patched_callable = _patched_registry.get_callable(fn)
|
patched_callable = _patched_registry.get_callable(fn)
|
||||||
if patched_callable is None:
|
if patched_callable is None:
|
||||||
|
@ -664,10 +649,9 @@ def _bind_injections(fn: Callable[..., Any], providers_map: ProvidersMap) -> Non
|
||||||
|
|
||||||
if injection in patched_callable.reference_closing:
|
if injection in patched_callable.reference_closing:
|
||||||
patched_callable.add_closing(injection, provider)
|
patched_callable.add_closing(injection, provider)
|
||||||
deps = {}
|
|
||||||
_locate_dependent_closing_args(provider, deps)
|
for resource in provider.traverse(types=[providers.Resource]):
|
||||||
for key, dep in deps.items():
|
patched_callable.add_closing(str(id(resource)), resource)
|
||||||
patched_callable.add_closing(key, dep)
|
|
||||||
|
|
||||||
|
|
||||||
def _unbind_injections(fn: Callable[..., Any]) -> None:
|
def _unbind_injections(fn: Callable[..., Any]) -> None:
|
||||||
|
|
|
@ -59,12 +59,13 @@ def init_service(counter: Counter, _list: List[int], _dict: Dict[str, int]):
|
||||||
|
|
||||||
|
|
||||||
class Container(containers.DeclarativeContainer):
|
class Container(containers.DeclarativeContainer):
|
||||||
|
config = providers.Configuration(default={"a": 1, "b": 4})
|
||||||
counter = providers.Singleton(Counter)
|
counter = providers.Singleton(Counter)
|
||||||
_list = providers.List(
|
_list = providers.List(
|
||||||
providers.Callable(lambda a: a, a=1), providers.Callable(lambda b: b, 2)
|
providers.Callable(lambda a: a, a=config.a), providers.Callable(lambda b: b, 2)
|
||||||
)
|
)
|
||||||
_dict = providers.Dict(
|
_dict = providers.Dict(
|
||||||
a=providers.Callable(lambda a: a, a=3), b=providers.Callable(lambda b: b, 4)
|
a=providers.Callable(lambda a: a, a=3), b=providers.Callable(lambda b: b, config.b)
|
||||||
)
|
)
|
||||||
service = providers.Resource(init_service, counter, _list, _dict=_dict)
|
service = providers.Resource(init_service, counter, _list, _dict=_dict)
|
||||||
service2 = providers.Resource(init_service, counter, _list, _dict=_dict)
|
service2 = providers.Resource(init_service, counter, _list, _dict=_dict)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user