2
2
3
3
import inspect
4
4
from abc import ABC , abstractmethod
5
- from collections import ChainMap , OrderedDict
6
- from contextlib import ContextDecorator , contextmanager
5
+ from collections import OrderedDict
6
+ from collections .abc import Callable , Iterable , Iterator , Mapping
7
+ from contextlib import ContextDecorator , contextmanager , suppress
7
8
from dataclasses import dataclass , field
8
9
from enum import Enum , auto
9
10
from functools import cached_property , singledispatchmethod , wraps
10
11
from inspect import Signature , get_annotations
11
12
from logging import getLogger
12
13
from types import MappingProxyType
13
- from typing import (
14
- Any ,
15
- Callable ,
16
- Iterable ,
17
- Iterator ,
18
- Mapping ,
19
- NamedTuple ,
20
- Protocol ,
21
- TypeVar ,
22
- cast ,
23
- final ,
24
- runtime_checkable ,
25
- )
14
+ from typing import Any , NamedTuple , Protocol , TypeVar , cast , final , runtime_checkable
26
15
27
16
from injection .common .event import Event , EventChannel , EventListener
17
+ from injection .common .formatting import format_type
28
18
from injection .common .lazy import Lazy , LazyMapping
29
19
from injection .exceptions import (
30
20
ModuleCircularUseError ,
40
30
T = TypeVar ("T" )
41
31
42
32
43
- def _format_type (cls : type ) -> str :
44
- try :
45
- return f"{ cls .__module__ } .{ cls .__qualname__ } "
46
- except AttributeError :
47
- return str (cls )
48
-
49
-
50
33
"""
51
34
Events
52
35
"""
@@ -64,7 +47,7 @@ class ContainerDependenciesUpdated(ContainerEvent):
64
47
def __str__ (self ) -> str :
65
48
length = len (self .references )
66
49
formatted_references = ", " .join (
67
- f"`{ _format_type (reference )} `" for reference in self .references
50
+ f"`{ format_type (reference )} `" for reference in self .references
68
51
)
69
52
return (
70
53
f"{ length } container dependenc{ 'ies' if length > 1 else 'y' } have been "
@@ -196,7 +179,7 @@ def __getitem__(self, reference: type[T], /) -> Injectable[T]:
196
179
try :
197
180
return self .__data [cls ]
198
181
except KeyError as exc :
199
- raise NoInjectable (f"No injectable for ` { _format_type ( cls ) } `." ) from exc
182
+ raise NoInjectable (reference ) from exc
200
183
201
184
def set_multiple (self , references : Iterable [type ], injectable : Injectable ):
202
185
references = set (self .__get_origin (reference ) for reference in references )
@@ -216,7 +199,7 @@ def check_if_exists(self, reference: type) -> type:
216
199
if reference in self .__data :
217
200
raise RuntimeError (
218
201
"An injectable already exists for the reference "
219
- f"class `{ _format_type (reference )} `."
202
+ f"class `{ format_type (reference )} `."
220
203
)
221
204
222
205
return reference
@@ -266,7 +249,11 @@ def __post_init__(self):
266
249
self .__container .add_listener (self )
267
250
268
251
def __getitem__ (self , reference : type [T ], / ) -> Injectable [T ]:
269
- return ChainMap (* self .__modules , self .__container )[reference ]
252
+ for getter in * self .__modules , self .__container :
253
+ with suppress (KeyError ):
254
+ return getter [reference ]
255
+
256
+ raise NoInjectable (reference )
270
257
271
258
def __setitem__ (self , on : type | Iterable [type ], injectable : Injectable , / ):
272
259
references = on if isinstance (on , Iterable ) else (on ,)
0 commit comments