Skip to content

Commit fdd8c15

Browse files
authored
refactoring: Add ignore_none_type option for type standardization
1 parent c05e323 commit fdd8c15

File tree

3 files changed

+30
-12
lines changed

3 files changed

+30
-12
lines changed

injection/_core/common/type.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ def get_yield_hint[T](
7272
def standardize_types(
7373
*types: InputType[Any],
7474
with_origin: bool = False,
75+
ignore_none_type: bool = False,
7576
) -> Iterator[TypeDef[Any]]:
7677
for tp in types:
77-
if tp in (None, NoneType):
78+
if tp is None or (ignore_none_type and tp is NoneType):
7879
continue
7980

8081
origin = get_origin(tp)
@@ -101,4 +102,8 @@ def standardize_types(
101102

102103
continue
103104

104-
yield from standardize_types(*inner_types, with_origin=with_origin)
105+
yield from standardize_types(
106+
*inner_types,
107+
with_origin=with_origin,
108+
ignore_none_type=ignore_none_type,
109+
)

injection/_core/descriptors.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ def __generate_keys(
5353
if name == descriptor_name:
5454
continue
5555

56-
key = self.__module.reserve_scoped_slot(hint, scope_name=self.__name)
56+
key = self.__module.reserve_scoped_slot(
57+
hint,
58+
scope_name=self.__name,
59+
ignore_none_type=True,
60+
)
5761
yield name, key
5862

5963
def __mapping_from(self, instance: object) -> dict[SlotKey[Any], Any]:

injection/_core/module.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
from injection._core.common.threading import get_lock
5656
from 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)
227228
class 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
"""
363371
Module
@@ -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

Comments
 (0)