cool_shit.py
· 1.4 KiB · Python
Eredeti
from database import read
from reddit_scraper.utils import limit_iter
from typing import Iterable, Generic, TypeVar, List
T = TypeVar('T')
class CustomIter(Generic[T]):
def __init__(self, i: Iterable[T]) -> None:
self.i = i
self.l: List[T] = []
def _iter_leftover(self) -> Iterable[T]:
for j in self.i:
self.l.append(j)
yield j
def __len__(self):
list(self._iter_leftover())
return len(self.l)
def __iter__(self):
yield from self.l
yield from self._iter_leftover()
@property
def empty(self) -> bool:
if len(self.l):
return False
for _ in self._iter_leftover():
return False
return True
@property
def first(self) -> T:
if self.empty:
raise KeyError("can't get first element from empty list")
return self.l[0]
@property
def last(self) -> T:
if self.empty:
raise KeyError("can't get last element from empty list")
list(self._iter_leftover())
return self.l[-1]
def test_iter():
print("yield foo")
yield "foo"
print("yield bar")
yield "bar"
print("yield baz")
yield "baz"
if __name__ == "__main__":
ci: Iterable = CustomIter(test_iter())
for c in ci:
print(c)
break
print("#" * 10)
for c in ci:
print(c)
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) |