@@ -122,8 +122,9 @@ def __init__(self, constructor: Callable, previous_error: TypeError):
122
122
class Binder (object ):
123
123
_bindings : Dict [Binding , Constructor ]
124
124
125
- def __init__ (self ) -> None :
125
+ def __init__ (self , allow_override : bool = False ) -> None :
126
126
self ._bindings = {}
127
+ self .allow_override = allow_override
127
128
128
129
def install (self , config : BinderCallable ) -> 'Binder' :
129
130
"""Install another callable configuration."""
@@ -171,7 +172,7 @@ def _check_class(self, cls: Binding) -> None:
171
172
if cls is None :
172
173
raise InjectorException ('Binding key cannot be None' )
173
174
174
- if cls in self ._bindings :
175
+ if not self . allow_override and cls in self ._bindings :
175
176
raise InjectorException ('Duplicate binding, key=%s' % cls )
176
177
177
178
if self ._is_forward_str (cls ):
@@ -197,10 +198,12 @@ def _is_forward_str(self, cls: Binding) -> bool:
197
198
class Injector (object ):
198
199
_bindings : Dict [Binding , Constructor ]
199
200
200
- def __init__ (self , config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True ):
201
+ def __init__ (
202
+ self , config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True , allow_override : bool = False
203
+ ):
201
204
self ._bind_in_runtime = bind_in_runtime
202
205
if config :
203
- binder = Binder ()
206
+ binder = Binder (allow_override )
204
207
config (binder )
205
208
self ._bindings = binder ._bindings
206
209
else :
@@ -358,33 +361,39 @@ def injection_wrapper(*args: Any, **kwargs: Any) -> T:
358
361
return injection_wrapper
359
362
360
363
361
- def configure (config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True ) -> Injector :
364
+ def configure (
365
+ config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True , allow_override : bool = False
366
+ ) -> Injector :
362
367
"""Create an injector with a callable config or raise an exception when already configured."""
363
368
global _INJECTOR
364
369
365
370
with _INJECTOR_LOCK :
366
371
if _INJECTOR :
367
372
raise InjectorException ('Injector is already configured' )
368
373
369
- _INJECTOR = Injector (config , bind_in_runtime = bind_in_runtime )
374
+ _INJECTOR = Injector (config , bind_in_runtime = bind_in_runtime , allow_override = allow_override )
370
375
logger .debug ('Created and configured an injector, config=%s' , config )
371
376
return _INJECTOR
372
377
373
378
374
- def configure_once (config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True ) -> Injector :
379
+ def configure_once (
380
+ config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True , allow_override : bool = False
381
+ ) -> Injector :
375
382
"""Create an injector with a callable config if not present, otherwise, do nothing."""
376
383
with _INJECTOR_LOCK :
377
384
if _INJECTOR :
378
385
return _INJECTOR
379
386
380
- return configure (config , bind_in_runtime = bind_in_runtime )
387
+ return configure (config , bind_in_runtime = bind_in_runtime , allow_override = allow_override )
381
388
382
389
383
- def clear_and_configure (config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True ) -> Injector :
390
+ def clear_and_configure (
391
+ config : Optional [BinderCallable ] = None , bind_in_runtime : bool = True , allow_override : bool = False
392
+ ) -> Injector :
384
393
"""Clear an existing injector and create another one with a callable config."""
385
394
with _INJECTOR_LOCK :
386
395
clear ()
387
- return configure (config , bind_in_runtime = bind_in_runtime )
396
+ return configure (config , bind_in_runtime = bind_in_runtime , allow_override = allow_override )
388
397
389
398
390
399
def is_configured () -> bool :
0 commit comments