File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1- from collections .abc import Callable , Iterator
2- from functools import partial
1+ from collections .abc import Callable
2+ from contextlib import suppress
33
44from injection ._core .common .invertible import Invertible
55
66
7- def lazy [T ](factory : Callable [..., T ]) -> Callable [[], T ]:
8- def cache () -> Iterator [T ]:
9- value = factory ()
10- while True :
11- yield value
12-
13- return partial (next , cache ())
14-
15-
167class Lazy [T ](Invertible [T ]):
17- __slots__ = ("__get " , "__is_set " )
8+ __slots__ = ("__factory " , "__value " )
189
19- __get : Callable [[], T ]
20- __is_set : bool
10+ __factory : Callable [[], T ]
11+ __value : T
2112
2213 def __init__ (self , factory : Callable [..., T ]) -> None :
23- @lazy
24- def get () -> T :
25- value = factory ()
26- self .__is_set = True
27- return value
28-
29- self .__get = get
30- self .__is_set = False
14+ self .__factory = factory
3115
3216 def __invert__ (self ) -> T :
33- return self .__get ()
17+ return self .value
3418
3519 @property
3620 def is_set (self ) -> bool :
37- return self .__is_set
21+ try :
22+ self .__value
23+ except AttributeError :
24+ return False
25+
26+ return True
27+
28+ @property
29+ def value (self ) -> T :
30+ with suppress (AttributeError ):
31+ return self .__value
32+
33+ value = self .__factory ()
34+ del self .__factory
35+
36+ self .__value = value
37+ return value
You can’t perform that action at this time.
0 commit comments