Python no es compatible con funciones anónimas complicadas. ¿Cuál es una buena alternativa? Por ejemplo:python: alternativa a las funciones anónimas
class Calculation:
def __init__(self, func):
self.func = func
def __call__(self, data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[self.func]
except KeyError:
pass # first-time call; calculate and cache the values
data[self.func] = self.func(data)
return data[self.func]
# with a simple function, which can be represented using lambda, this works great
f1 = Calculation(lambda data : data['a'] * data['b'])
# with a complicated function, I can do this:
def f2_aux:
# some complicated calculation, which isn't suitable for a lambda one-liner
f2 = Calculation(f2_aux)
¿Es este un diseño razonable para empezar?
Si es así, ¿hay alguna manera de evitar la fealdad de f * _aux por cada f * que defino en el módulo?
UPDATE:
Ejemplo de uso:
d = {'a' : 3, 'b' : 6}
# computes 3 * 6
# stores 18 in d under a key <function <lambda> at ...>
# returns 18
f1(d)
# retrieves 18 from d[<function <lambda> at ...>]
# returns 18, without having to recalculate it
f1(d)
UPDATE:
Sólo por mi entendimiento, añadí una versión que utiliza la función interior.
def memoize(func):
def new_func(data):
try:
# check if the value has already been calculated
# if it has, it would be cached under key = self.func
return data[func]
except KeyError:
pass # first-time call; calculate and cache the values
data[func] = func(data)
return data[func]
return new_func
@memoize
def f1(data):
return data['a'] * data['b']
No, este no es un diseño razonable. Parece que está haciendo memoialización (que no está relacionada con funciones anónimas) y lo está haciendo mal. 'f1 = lambda a: expression' es siempre exactamente igual que' def f1 (a): return expression'. [Este es un buen decorador de memoraciones para estudiar] (http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize). Por cierto, '@decorator def function: pass' es siempre exactamente lo mismo que' def function: pass; function = decorator (función) ' –
Lo malo es que tu memoial está roto. El 'caché 'de datos de resultado también es el argumento de su función ... –
@FrancisAvila: Tenía la intención de almacenar en caché el valor de' f (data) 'en el elemento del diccionario' data [f] '. Sé que los "datos" que se me pasan nunca utilizarán esa clave, y el conflicto con otro tampoco debería ocurrir, ya que el valor de otra función se almacenaría en caché con otra clave. Parece que funciona (técnicamente); es el problema solo en el código innecesariamente confuso? – max