Aplicar lista de funciones en un objeto en Python

¿Hay alguna forma clara de aplicar una lista de funciones en un objeto en Python sin lambda o enumeración de listas? Como la expresión de Haskell:

map ($ obj) [foo1,foo2] 

Ejemplo con lambda en Python:

 response = map(lambda foo:foo(obj),[foo1,foo2]) #fooX:object->Bool 

¿Es extensible a las funciones de clase?

Tal vez algo del operador o itertools?

Creo que esto debería ajustarse a sus criterios “funcionales”. Para responder a su pregunta, no creo que exista una forma clara y debería aclimatarse para enumerar las comprensiones.

Según lo sugerido por @JFSebastian

 >>> from operator import methodcaller >>> funcs = (lambda x: x + 1, lambda x: x + 2) >>> obj = 5 >>> map(methodcaller('__call__', obj), funcs) [6, 7] 

Aquí hay una forma loca de hacerlo:

 >>> from itertools import starmap, repeat >>> from types import FunctionType >>> funcs = (lambda x: x + 1, lambda x: x + 2) >>> obj = 5 >>> list(starmap(FunctionType.__call__, zip(funcs, repeat(obj)))) [6, 7] 

Según lo sugerido por @AleksiTorhamo

 >>> from itertools import repeat >>> from types import FunctionType >>> obj = 5 >>> funcs = (lambda x: x + 1, lambda x: x + 2) >>> map(FunctionType.__call__, funcs, repeat(obj)) [6, 7] 

Siempre puedes crear una función para que se haga cargo de ti:

 def map_funcs(obj, func_list): return [func(obj) for func in func_list] # I was under the impression that the OP wanted to compose the functions, # ie f3(f2(f1(f0(obj))), for which the line below is applicable: # return reduce(lambda o, func: func(o), func_list, obj) map_funcs(it, [Buy, Use, Break, Fix]) 

El problema es el operador $ faltante que es trivialmente definido por

 def apply(f, a): return f(a) 

entonces uno puede hacer el curry ($ obj) con un parcial en python como este: partial(apply, a=obj)

Teniendo esto podemos hacer un mapa aplicar con

 map(partial(apply, a=obj), [foo1, foo2])) 

Creo que las comprensiones de listas son la mejor manera de construir una lista basada en otra. Aplicar funciones regulares de una lista es bastante fácil:

 results = [f(obj) for f in funcList] 

Si no necesita la lista completa de resultados a la vez, pero solo necesita iterar sobre los elementos de uno en uno, la expresión del generador puede ser mejor:

 genexp = (f(obj) for f in funcList) for r in genexp: doSomething(r) 

Si sus funciones son métodos, en lugar de funciones básicas, hay dos formas de hacerlo:

Utilizando métodos enlazados, en cuyo caso no es necesario proporcionar el objeto en absoluto al realizar las llamadas de función:

 obj = SomeClass() funcList = [obj.foo1, obj.foo2] results = [f() for f in funcList] 

O utilizando métodos no vinculados, que son simplemente funciones regulares que esperan una instancia de la clase en la que se definen como su primer argumento (convencionalmente denominado self ):

 funcList = [SomeClass.foo1, SomeClass.foo2] obj = SomeClass() results = [f(obj) for f in funcList] 

Por supuesto, si no necesita capturar los resultados de la función, es más simple simplemente escribir un bucle:

 for f in funcList: f(obj)