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