@@ -61,6 +61,7 @@ class ContainerEvent(Event, ABC):
61
61
@dataclass (frozen = True , slots = True )
62
62
class ContainerDependenciesUpdated (ContainerEvent ):
63
63
classes : Collection [type ]
64
+ override : bool
64
65
65
66
def __str__ (self ) -> str :
66
67
length = len (self .classes )
@@ -212,26 +213,19 @@ def is_locked(self) -> bool:
212
213
def __injectables (self ) -> frozenset [Injectable ]:
213
214
return frozenset (self .__data .values ())
214
215
215
- def update (self , classes : Types , injectable : Injectable ):
216
- classes = frozenset ( get_origins (* classes ))
216
+ def update (self , classes : Types , injectable : Injectable , override : bool ):
217
+ values = { origin : injectable for origin in get_origins (* classes )}
217
218
218
- if classes :
219
- event = ContainerDependenciesUpdated (self , classes )
219
+ if values :
220
+ event = ContainerDependenciesUpdated (self , values , override )
220
221
221
222
with self .notify (event ):
222
- self .__data .update (
223
- (self .check_if_exists (cls ), injectable ) for cls in classes
224
- )
225
-
226
- return self
223
+ if not override :
224
+ self .__check_if_exists (* values )
227
225
228
- def check_if_exists (self , cls : type ) -> type :
229
- if cls in self .__data :
230
- raise RuntimeError (
231
- f"An injectable already exists for the class `{ format_type (cls )} `."
232
- )
226
+ self .__data .update (values )
233
227
234
- return cls
228
+ return self
235
229
236
230
def unlock (self ):
237
231
for injectable in self .__injectables :
@@ -244,6 +238,13 @@ def add_listener(self, listener: EventListener):
244
238
def notify (self , event : Event ) -> ContextManager | ContextDecorator :
245
239
return self .__channel .dispatch (event )
246
240
241
+ def __check_if_exists (self , * classes : type ):
242
+ for cls in classes :
243
+ if cls in self .__data :
244
+ raise RuntimeError (
245
+ f"An injectable already exists for the class `{ format_type (cls )} `."
246
+ )
247
+
247
248
248
249
"""
249
250
Module
@@ -280,7 +281,7 @@ def __getitem__(self, cls: type[_T] | UnionType, /) -> Injectable[_T]:
280
281
raise NoInjectable (cls )
281
282
282
283
def __setitem__ (self , cls : type | UnionType , injectable : Injectable , / ):
283
- self .update ((cls ,), injectable )
284
+ self .update ((cls ,), injectable , override = True )
284
285
285
286
def __contains__ (self , cls : type | UnionType , / ) -> bool :
286
287
return any (cls in broker for broker in self .__brokers )
@@ -304,22 +305,29 @@ def injectable(
304
305
* ,
305
306
cls : type [Injectable ] = NewInjectable ,
306
307
on : type | Types = None ,
308
+ override : bool = False ,
307
309
):
308
310
def decorator (wp ):
309
311
factory = self .inject (wp , return_factory = True )
310
312
injectable = cls (factory )
311
313
classes = find_types (wp , on )
312
- self .update (classes , injectable )
314
+ self .update (classes , injectable , override )
313
315
return wp
314
316
315
317
return decorator (wrapped ) if wrapped else decorator
316
318
317
319
singleton = partialmethod (injectable , cls = SingletonInjectable )
318
320
319
- def set_constant (self , instance : _T , on : type | Types = None ) -> _T :
321
+ def set_constant (
322
+ self ,
323
+ instance : _T ,
324
+ on : type | Types = None ,
325
+ * ,
326
+ override : bool = False ,
327
+ ) -> _T :
320
328
cls = type (instance )
321
329
322
- @self .injectable (on = (cls , on ))
330
+ @self .injectable (on = (cls , on ), override = override )
323
331
def get_constant ():
324
332
return instance
325
333
@@ -364,8 +372,8 @@ def get_instance(self, cls: type[_T], none: bool = True) -> _T | None:
364
372
def get_lazy_instance (self , cls : type [_T ]) -> Lazy [_T | None ]:
365
373
return Lazy (lambda : self .get_instance (cls ))
366
374
367
- def update (self , classes : Types , injectable : Injectable ):
368
- self .__container .update (classes , injectable )
375
+ def update (self , classes : Types , injectable : Injectable , override : bool = False ):
376
+ self .__container .update (classes , injectable , override )
369
377
return self
370
378
371
379
def use (
0 commit comments