Композиция нескольких функций на одну, каждая по определенному ключевому слову - PullRequest
0 голосов
/ 03 июля 2019

У меня есть три функции:

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.

1 Ответ

0 голосов
/ 03 июля 2019

Как насчет использования лямбда-функции?

ask_and_add = lambda : addition(get_input(),get_input())

Затем вы можете вызывать ее всякий раз, когда вам это нужно:

ask_and_add()

Вам будет предложено ввести два последовательных входа иВы получите сумму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...