最後活躍 1755265730

Hazel's Avatar Hazel 已修改 1755265729. 還原成這個修訂版本

1 file changed, 29 insertions, 11 deletions

cool_shit.py

@@ -1,7 +1,7 @@
1 1 from database import read
2 2
3 3 from reddit_scraper.utils import limit_iter
4 - from typing import Iterable, Generic, TypeVar, List
4 + from typing import Iterable, Generic, TypeVar, List, Iterator
5 5
6 6
7 7 T = TypeVar('T')
@@ -11,27 +11,40 @@ class CustomIter(Generic[T]):
11 11 def __init__(self, i: Iterable[T]) -> None:
12 12 self.i = i
13 13 self.l: List[T] = []
14 + self.is_generated = False
14 15
15 - def _iter_leftover(self) -> Iterable[T]:
16 - for j in self.i:
17 - self.l.append(j)
18 - yield j
16 + # if i doesn't have __next__ pre generate it as it is not lazy
17 + if not isinstance(self.i, Iterator):
18 + self.generate()
19 +
20 + def generate(self):
21 + if not self.is_generated:
22 + self.l.extend(self.i)
23 + self.is_generated = True
19 24
20 25 def __len__(self):
21 - list(self._iter_leftover())
26 + self.generate()
22 27 return len(self.l)
23 28
24 29 def __iter__(self):
25 30 yield from self.l
26 - yield from self._iter_leftover()
31 +
32 + if not self.is_generated:
33 + for j in self.i:
34 + self.l.append(j)
35 + yield j
36 + self.is_generated = True
37 +
27 38
28 39 @property
29 40 def empty(self) -> bool:
30 41 if len(self.l):
31 42 return False
32 43
33 - for _ in self._iter_leftover():
34 - return False
44 + if not self.is_generated:
45 + for j in self.i:
46 + self.l.append(j)
47 + return False
35 48
36 49 return True
37 50
@@ -43,10 +56,11 @@ class CustomIter(Generic[T]):
43 56
44 57 @property
45 58 def last(self) -> T:
46 - if self.empty:
59 + self.generate()
60 +
61 + if not len(self.l):
47 62 raise KeyError("can't get last element from empty list")
48 63
49 - list(self._iter_leftover())
50 64 return self.l[-1]
51 65
52 66
@@ -66,6 +80,10 @@ if __name__ == "__main__":
66 80 print(c)
67 81 break
68 82
83 + print("#" * 10)
84 + for c in ci:
85 + print(c)
86 +
69 87 print("#" * 10)
70 88 for c in ci:
71 89 print(c)

Hazel's Avatar Hazel 已修改 1755264548. 還原成這個修訂版本

1 file changed, 71 insertions

cool_shit.py(檔案已創建)

@@ -0,0 +1,71 @@
1 + from database import read
2 +
3 + from reddit_scraper.utils import limit_iter
4 + from typing import Iterable, Generic, TypeVar, List
5 +
6 +
7 + T = TypeVar('T')
8 +
9 +
10 + class CustomIter(Generic[T]):
11 + def __init__(self, i: Iterable[T]) -> None:
12 + self.i = i
13 + self.l: List[T] = []
14 +
15 + def _iter_leftover(self) -> Iterable[T]:
16 + for j in self.i:
17 + self.l.append(j)
18 + yield j
19 +
20 + def __len__(self):
21 + list(self._iter_leftover())
22 + return len(self.l)
23 +
24 + def __iter__(self):
25 + yield from self.l
26 + yield from self._iter_leftover()
27 +
28 + @property
29 + def empty(self) -> bool:
30 + if len(self.l):
31 + return False
32 +
33 + for _ in self._iter_leftover():
34 + return False
35 +
36 + return True
37 +
38 + @property
39 + def first(self) -> T:
40 + if self.empty:
41 + raise KeyError("can't get first element from empty list")
42 + return self.l[0]
43 +
44 + @property
45 + def last(self) -> T:
46 + if self.empty:
47 + raise KeyError("can't get last element from empty list")
48 +
49 + list(self._iter_leftover())
50 + return self.l[-1]
51 +
52 +
53 + def test_iter():
54 + print("yield foo")
55 + yield "foo"
56 + print("yield bar")
57 + yield "bar"
58 + print("yield baz")
59 + yield "baz"
60 +
61 +
62 + if __name__ == "__main__":
63 + ci: Iterable = CustomIter(test_iter())
64 +
65 + for c in ci:
66 + print(c)
67 + break
68 +
69 + print("#" * 10)
70 + for c in ci:
71 + print(c)
上一頁 下一頁