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?

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Will you buy me a coffee?

Visitors in real time

You are alone: 🐱