Fix infinite loop with Closing+ConfigurationOption

This commit is contained in:
ZipFile 2025-03-10 20:35:37 +00:00
parent 57123cebaa
commit 6685c5a141
2 changed files with 6 additions and 21 deletions

View File

@ -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:

View File

@ -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)