У меня недостаточно опыта работы с Python, чтобы понять, стоит ли менять язык. Но я хотел описать опции, доступные на текущем языке.
Чтобы избежать непредвиденного поведения, функциональная композиция в идеале должна следовать стандартному математическому (или хаскелевскому) порядку операций, то есть f ∘ g ∘ h
должно означать применить h
, затем g
, затем f
.
Если вы хотите использовать существующий оператор в Python, скажите <<
, поскольку вы упоминаете, что у вас будут проблемы с лямбдами и встроенными модулями. Вы можете упростить свою жизнь, определив отраженную версию __rlshift__
в дополнение к __lshift__
. При этом лямбда / встроенные модули, смежные с composable
объектами, будут учтены. Когда у вас есть две смежные лямбда / встроенные команды, вам нужно явно преобразовать (только одну) их с помощью composable
, как предложено @ si14. Обратите внимание, я действительно имею в виду __rlshift__
, а не __rshift__
; на самом деле, я бы не советовал вообще использовать __rshift__
, так как изменение порядка сбивает с толку, несмотря на указание направления, предоставленное формой оператора.
Но есть другой подход, который вы можете рассмотреть. У Фердинанда Ямицкого есть отличный рецепт для определения псевдоинфиксных операторов в Python, которые работают даже со встроенными модулями. При этом вы можете написать f |o| g
для композиции функций, что на самом деле выглядит очень разумно.