Python позволяет перегружать множество различных операторов, и оператор shift является одним из них. Вот пример того, как создать композицию функции с помощью этого оператора. Здесь эти знаки показывают направление потока данных:



 collections import deque

from math import sqrt





class Compose:

def __init__(self):

self._functions = deque()



def __call__(self, *args, **kwargs):

result = None

for f in self._functions:

result = f(*args, **kwargs)

args = [result]

kwargs = dict()

return result



def __rshift__(self, f):

self._functions.append(f)

return self



def __lshift__(self, f):

self._functions.appendleft(f)

return self





compose = Compose





sqrt_abs = (compose() << sqrt << abs)

sqrt_abs2 = (compose() >> abs >> sqrt)



print(sqrt_abs(-4)) # 2.0

print(sqrt_abs2(-4)) # 2.0