Объединить функции для последующего использования в карте
У меня есть список элементов, поступающих от одного объекта типа A, и библиотека, которая работает с объектом типа B.
Я хотел бы преобразовать A в B, а затем вызвать функцию B питоническим способом. Что я придумала до сих пор:
def convert_A_to_B(A):
return B(A.something, A.something_else)
def doStuff(a_list):
converted_to_b = list(map(convert_A_to_B, a_list)
return list(map(B.function, converted_to_b))
Я мог бы создать лямбду, чтобы объединить эти функции, но я чувствую, что должен быть более легкий путь. Что-то вроде:
return list(map(combine(convert_A_to_B, B.function)))
2 ответа
from functools import partial, reduce
combine = lambda *xs: partial (reduce, lambda v,x: x(v), xs)
Функция может быть использована, например, combine (A.foo, A.bar) (x)
с эквивалентно A.bar(A.foo (x))
,
combine
примет переменное число функций и вернет новую функцию, которая принимает одно значение. Это значение будет затем проходить через каждую ранее упомянутую функцию (в цепочке), пока окончательный результат не будет возвращен.
Пример использования
map (combine (convert_A_to_B, B.function), a_list)
Я бы использовал понимание списка, а не list(map(...))
Вот:
return [B(A.something, A.something_else).function() for A in a_list]
Вы могли бы сделать то же самое с map()
и lambda
но вышесказанное более читабельно:
return list(map(lambda A: B(A.something, A.something_else).function(), a_list))
Если вы хотите повторно использовать converted_to_b
просто сделай так:
return [converted_to_b(A).function() for A in a_list]