Конвейер функций в Python
В данном примере мы создаём класс Pipe с перегрузкой метода __or__.
Метод __or__. был добавлен для поддержки синтаксиса X | Y, как замена typing.Union и также используется для указания, что переменная или функция могут принимать несколько различных типов значений.
import typing
int | str == typing.Union[int, str] # True
class Pipe:
def __init__(self, value):
self.value = value
def __or__(self, other):
if callable(other):
return Pipe(other(self.value))
else:
raise ValueError("Right operand must be callable")
def multiply_2(x):
return x * 2
def add_3(x):
return x + 3
changed_num = Pipe(5) | multiply_2 | add_3 # 5 * 2 + 3
print(changed_num.value) # 13
Более "сложный" пример добавил в статью как вариант для валидации атрибутов класса.