У меня есть три функции:
def addition(a: int, b: int):
return a + b
def increment(x: float) -> int:
return int(x) + 1
def decrement(y: int) -> int:
return x - 1
Я хотел бы составить increment
и decrement
поверх addition
, чтобы получить функцию, которая имеет сигнатуру новой структуры. Обратите внимание, что я пока не хочу запускать результирующую функцию (ленивая композиция).
Как бы я поступил так, когда такие вещи, как toolz.compose
ожидают один ввод / вывод составных функций, а functools.partial
или toolz.curry
не могут получить функцию в качестве параметра (они обрабатывают ее так, как если бы она была значение).
По сути, я ищу версию партиала / карри более высокого порядка.
EDIT:
Я не могу использовать лямбду, потому что я хочу, чтобы новая функция имела сигнатуру int
и float
, и я хочу иметь возможность получить эту сигнатуру из полученной функции, используя inspect.signature
.
Поэтому, учитывая функции a, b и c и некоторые ключевые слова k1 и k2, я бы хотел соединить a, b поверх c, с ключевыми словами k1 и k2 и получить функцию с сигнатурой параметров a объединенный с параметрами б.
Если мы будем придерживаться приведенного выше примера, я хочу что-то вроде:
new_func = pipeline(addition, via("a"), increment, via("b") decrement)
где via
до сих пор составляет функцию для несвязанного ключевого слова конвейера.
Результатом, new_func
, будет функция, которая ожидает две переменные x: float
и y: int
и возвращает int
.