35. Evaluación perezosa
Crea una función que simule la "evaluación perezosa" (lazy evaluation). Esto significa que una expresión o cálculo solo se realiza cuando su valor es realmente necesario, no inmediatamente.
La función lazy_eval debe aceptar una función f y sus argumentos. En lugar de ejecutar f inmediatamente, debe devolver un "objeto perezoso" que, al ser evaluado (por ejemplo, al acceder a un método value), ejecute la función y cachee su resultado.
class LazyValue:
def __init__(self, func, *args, **kwargs):
self._func = func
self._args = args
self._kwargs = kwargs
self._cached_value = None
self._evaluated = False
def value(self):
# Implementa la evaluación perezosa y el cacheo
pass
# Ejemplo de uso
def calculo_costoso(a, b):
print("Realizando cálculo costoso...")
return a * b
# No se ejecuta inmediatamente
lazy_resultado = LazyValue(calculo_costoso, 10, 20)
print("Objeto perezoso creado, aún no se ha calculado.")
# Se ejecuta solo cuando se pide el valor
resultado = lazy_resultado.value()
print(f"El resultado es: {resultado}") # "Realizando cálculo costoso..." y "El resultado es: 200"
# Segunda vez, se usa el valor cacheado
resultado_cached = lazy_resultado.value()
print(f"El resultado cacheado es: {resultado_cached}") # Solo "El resultado cacheado es: 200"
Ratoncito
Implementa el método value de LazyValue para que ejecute la función la primera vez que se accede a él y almacene el resultado para futuras llamadas.
Dragón
Añade un mecanismo para "invalidar" el caché del valor perezoso, forzando una nueva evaluación la próxima vez que se solicite el valor. Considera casos donde la función original podría lanzar una excepción; ¿cómo manejaría el objeto perezoso esto?
Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.
Apóyame en Ko-fi