Python Pipes
Я всегда хотел иметь способ создавать конвейеры обработки данных в Python, используя пайпы, что-то вроде range(10) | F(is_odd) | P(lambda x: x * 2), вместо функций, генераторов, map’ов и циклов. Так что я попробовал… Идея довольно простая: давайте создадим класс с реализованными операторами | и ||, то есть пайпами. def __or__(self, other): other.source = self return other def __ror__(self, other): self.source = ( iter(other) if not isinstance(other, (str, bytes)) and hasattr(other, "__iter__") else other ) return self Сложность заключалась в реализации метода __next__, так как я хотел, чтобы это была ленивое вычисление. После нескольких попыток и ошибок я пришёл к довольно простому подходу: обёрточный класс, реализующий пайп, вызывает next у своего источника, добавленного через | или ||, применяет трансформацию и затем возвращает результат этой трансформации. ...