@dataclass
class MultiFilter:
functions: list = field(default_factory=list)
mode: str = 'judge_any'
iterable: list = field(default_factory=list, init=False)
def __post_init__(self):
self.pos = len(self.functions) // 2
def judge_half(self, v):
return sum(map(lambda f: f(v), self.functions)) > self.pos
def judge_any(self, v):
return any(map(lambda f: f(v), self.functions))
def judge_all(self, v):
return all(map(lambda f: f(v), self.functions))
def __call__(self, v, mode='judge_any'):
return getattr(self, mode or self.mode)(v)
def __iter__(self):
return (v for v in self.iterable if getattr(self, self.mode)(v))
custom_filter = MultiFilter([
lambda x: x % 2 != 0,
lambda x: x > 10
])
print(list(filter(custom_filter, range(20))))
> [1, 3, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19]
custom_filter.iterable = range(20)
print(list(custom_filter))
> [1, 3, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19]
return ans1, ans2
??? from dataclasses import dataclass, field
from multiprocessing import Pool
from random import randint
class Driver:
def get(self, url):
print(url)
def close(self):
print('close')
@dataclass
class WebDriver:
xpath: str = field(default='')
url: str = field(default='')
content: list = field(default_factory=list)
driver: any = None
def __post_init__(self):
self.driver.get(self.url)
def get_content(self):
pass
def return_result(self):
for _ in range(10):
self.get_content()
return self.content
def close(self):
self.driver.close()
class Yandex(WebDriver):
def get_content(self):
self.content.append(f'yandex content {randint(1, 1000)}')
class Google(WebDriver):
def get_content(self):
self.content.append(f'yandex content {randint(1, 1000)}')
def start_parser(ClassParser):
parser = ClassParser(driver=Driver())
return parser.return_result()
if __name__ == "__main__":
pool = Pool(processes=2)
l = [v for v in pool.map(start_parser, [Yandex, Google])]
print(l)
class A:
def blabla(self):
print('blabla')
class С:
def blabla(self):
print('blabla')
def decor(fn):
def verified(*args, **kwargs):
print('verified: blabla')
return fn(*args, **kwargs)
return verified
# Зачем то добавили декоратор, но все про это забуд пока не сломается.
A.blabla = decor(A.blabla)
class B(С):
@decor
def blabla(self):
"""
Переопредили метод, для понятных целей. при использовании кастомного класса
будет понятнее что поведение может отличатся от задокументированного.
:return:
"""
super().blabla()
B().blabla()
A().blabla()
но в реальных браузерах его почти нет.