Объединить функции для последующего использования в карте

У меня есть список элементов, поступающих от одного объекта типа 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]
Другие вопросы по тегам