5555from injection ._core .common .threading import get_lock
5656from injection ._core .common .type import (
5757 InputType ,
58+ TypeDef ,
5859 TypeInfo ,
5960 get_return_types ,
6061 get_yield_hint ,
@@ -223,11 +224,12 @@ class Record[T](NamedTuple):
223224 mode : Mode
224225
225226
226- @dataclass (repr = False , eq = False , kw_only = True , slots = True )
227+ @dataclass (repr = False , eq = False , frozen = True , kw_only = True , slots = True )
227228class Updater [T ]:
228229 classes : Iterable [InputType [T ]]
229230 injectable : Injectable [T ]
230231 mode : Mode
232+ ignore_none_type : bool
231233
232234 def make_record (self ) -> Record [T ]:
233235 return Record (self .injectable , self .mode )
@@ -239,11 +241,13 @@ def with_basics(
239241 / ,
240242 injectable : Injectable [T ],
241243 mode : Mode | ModeStr ,
244+ ignore_none_type : bool = False ,
242245 ) -> Self :
243246 return cls (
244247 classes = get_return_types (on ),
245248 injectable = injectable ,
246249 mode = Mode (mode ),
250+ ignore_none_type = ignore_none_type ,
247251 )
248252
249253
@@ -284,9 +288,9 @@ def __injectables(self) -> frozenset[Injectable[Any]]:
284288 return frozenset (record .injectable for record in self .__records .values ())
285289
286290 def update [T ](self , updater : Updater [T ]) -> Self :
287- updater = self .__update_preprocessing (updater )
288291 record = updater .make_record ()
289- records = dict (self .__prepare_for_updating (updater .classes , record ))
292+ classes = self .__reduce_classes (updater )
293+ records = dict (self .__prepare_for_updating (classes , record ))
290294
291295 if records :
292296 event = LocatorDependenciesUpdated (self , records .keys (), record .mode )
@@ -347,17 +351,21 @@ def __keep_new_record[T](
347351
348352 return new_mode .rank > existing_mode .rank
349353
354+ @staticmethod
355+ def __reduce_classes [T ](updater : Updater [T ]) -> frozenset [TypeDef [T ]]:
356+ return frozenset (
357+ standardize_types (
358+ * updater .classes ,
359+ ignore_none_type = updater .ignore_none_type ,
360+ )
361+ )
362+
350363 @staticmethod
351364 def __standardize_inputs [T ](
352365 classes : Iterable [InputType [T ]],
353366 ) -> Iterator [InputType [T ]]:
354367 return standardize_types (* classes , with_origin = True )
355368
356- @staticmethod
357- def __update_preprocessing [T ](updater : Updater [T ]) -> Updater [T ]:
358- updater .classes = frozenset (standardize_types (* updater .classes ))
359- return updater
360-
361369
362370"""
363371Module
@@ -556,9 +564,10 @@ def reserve_scoped_slot[T](
556564 scope_name : str ,
557565 * ,
558566 mode : Mode | ModeStr = Mode .get_default (),
567+ ignore_none_type : bool = False ,
559568 ) -> SlotKey [T ]:
560569 injectable = ScopedSlotInjectable (cls , scope_name )
561- updater = Updater .with_basics (cls , injectable , mode )
570+ updater = Updater .with_basics (cls , injectable , mode , ignore_none_type )
562571 self .update (updater )
563572 return injectable .key
564573
0 commit comments