11
11
from __future__ import annotations
12
12
13
13
import abc
14
- from typing import Self
14
+ from typing import Generic , TypeVar
15
15
16
+ __all__ = ("Provider" , "Override" )
16
17
17
- class Provider [T ](abc .ABC ):
18
+ T = TypeVar ("T" )
19
+ U = TypeVar ("U" )
20
+
21
+
22
+ class Provider (abc .ABC , Generic [T ]):
18
23
"""
19
24
Signposts something that can be injected.
20
25
"""
@@ -37,13 +42,13 @@ def _evaluate(self) -> T:
37
42
"""
38
43
return self ()
39
44
40
- def override [ U : Provider | None ] (self , provider : U ) -> Override [U ]:
45
+ def override (self , provider : Provider [ U ] | None ) -> Override [Provider [ U ] | None ]:
41
46
"""
42
47
Override the current providers value with another provider.
43
48
"""
44
49
return Override (self , provider )
45
50
46
- def override_existing [ U ] (self , value : U ) -> Override [Provider [T ]]:
51
+ def override_existing (self , value : U ) -> Override [Provider [U ]]:
47
52
"""
48
53
Override the current provider with an existing singleton.
49
54
"""
@@ -52,21 +57,21 @@ def override_existing[U](self, value: U) -> Override[Provider[T]]:
52
57
return self .override (ExistingSingleton (value ))
53
58
54
59
55
- class Override [ ProviderT : Provider ] :
60
+ class Override ( Generic [ T ]) :
56
61
"""
57
62
A context manager to implement overrides for providers.
58
63
"""
59
64
60
65
__slots__ = ("_base" , "_override" , "_before" )
61
66
62
- def __init__ (self , base : Provider , override : ProviderT | None = None ):
67
+ def __init__ (self , base : Provider , override : Provider [ T ] | None = None ):
63
68
# noinspection PyProtectedMember
64
69
self ._before = base ._override
65
70
self ._base = base
66
71
self ._override = override
67
72
base ._override = override
68
73
69
- def __enter__ (self ) -> Self :
74
+ def __enter__ (self ) -> Override [ T ] :
70
75
yield self
71
76
72
77
def disable (self ) -> None :
0 commit comments