Skip to content

Commit 2d45015

Browse files
committed
Extract method
1 parent 11b52e2 commit 2d45015

File tree

1 file changed

+30
-26
lines changed

1 file changed

+30
-26
lines changed

injector/__init__.py

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def __repr__(self) -> str:
341341

342342

343343
@private
344-
class Multibinder(Provider, Generic[T]):
344+
class MultiBinder(Provider, Generic[T]):
345345
"""Provide a list of instances via other Providers."""
346346

347347
_multi_bindings: List['Binding']
@@ -377,7 +377,7 @@ def __repr__(self) -> str:
377377
return '%s(%r)' % (type(self).__name__, self._multi_bindings)
378378

379379

380-
class MultiBindProvider(Multibinder[List[T]]):
380+
class MultiBindProvider(MultiBinder[List[T]]):
381381
"""Used by :meth:`Binder.multibind` to flatten results of providers that
382382
return sequences."""
383383

@@ -389,7 +389,7 @@ def get(self, injector: 'Injector') -> List[T]:
389389
return result
390390

391391

392-
class MapBindProvider(Multibinder[Dict[str, T]]):
392+
class MapBindProvider(MultiBinder[Dict[str, T]]):
393393
"""A provider for map bindings."""
394394

395395
def get(self, injector: 'Injector') -> Dict[str, T]:
@@ -557,25 +557,8 @@ def multibind(
557557
558558
:param scope: Optional Scope in which to bind.
559559
"""
560-
if interface not in self._bindings:
561-
provider: Multibinder
562-
if (
563-
isinstance(interface, dict)
564-
or isinstance(interface, type)
565-
and issubclass(interface, dict)
566-
or _get_origin(_punch_through_alias(interface)) is dict
567-
):
568-
provider = MapBindProvider(self)
569-
else:
570-
provider = MultiBindProvider(self)
571-
binding = self.create_binding(interface, provider)
572-
self._bindings[interface] = binding
573-
else:
574-
binding = self._bindings[interface]
575-
assert isinstance(binding.provider, Multibinder)
576-
provider = binding.provider
577-
578-
if isinstance(provider, MultiBindProvider) and isinstance(to, list):
560+
multi_binder = self._get_multi_binder(interface)
561+
if isinstance(multi_binder, MultiBindProvider) and isinstance(to, list):
579562
try:
580563
element_type = get_args(_punch_through_alias(interface))[0]
581564
except IndexError:
@@ -584,8 +567,8 @@ def multibind(
584567
)
585568
for element in to:
586569
element_binding = self.create_binding(element_type, element, scope)
587-
provider.append(element_binding.provider, element_binding.scope)
588-
elif isinstance(provider, MapBindProvider) and isinstance(to, dict):
570+
multi_binder.append(element_binding.provider, element_binding.scope)
571+
elif isinstance(multi_binder, MapBindProvider) and isinstance(to, dict):
589572
try:
590573
value_type = get_args(_punch_through_alias(interface))[1]
591574
except IndexError:
@@ -594,10 +577,31 @@ def multibind(
594577
)
595578
for key, value in to.items():
596579
element_binding = self.create_binding(value_type, value, scope)
597-
provider.append(KeyValueProvider(key, element_binding.provider), element_binding.scope)
580+
multi_binder.append(KeyValueProvider(key, element_binding.provider), element_binding.scope)
598581
else:
599582
element_binding = self.create_binding(interface, to, scope)
600-
provider.append(element_binding.provider, element_binding.scope)
583+
multi_binder.append(element_binding.provider, element_binding.scope)
584+
585+
def _get_multi_binder(self, interface: type) -> MultiBinder:
586+
multi_binder: MultiBinder
587+
if interface not in self._bindings:
588+
if (
589+
isinstance(interface, dict)
590+
or isinstance(interface, type)
591+
and issubclass(interface, dict)
592+
or _get_origin(_punch_through_alias(interface)) is dict
593+
):
594+
multi_binder = MapBindProvider(self)
595+
else:
596+
multi_binder = MultiBindProvider(self)
597+
binding = self.create_binding(interface, multi_binder)
598+
self._bindings[interface] = binding
599+
else:
600+
binding = self._bindings[interface]
601+
assert isinstance(binding.provider, MultiBinder)
602+
multi_binder = binding.provider
603+
604+
return multi_binder
601605

602606
def install(self, module: _InstallableModuleType) -> None:
603607
"""Install a module into this binder.

0 commit comments

Comments
 (0)