Incluso después de su edición, y la serie de comentarios con detly, todavía no entiendo realmente.En su primera oración, dice que se supone que la primera llamada a f() llama a g(), pero posteriormente devuelve valores en caché. Pero luego en sus comentarios, dice "g() no se llama sin importar qué" (énfasis mío). No estoy seguro de lo que estás negando: ¿Estás diciendo que g() debería llamarse nunca (no tiene mucho sentido, ¿por qué g() existe?); o que se llame a g() , pero podría no (bueno, eso todavía contradice que se llame a g() en la primera llamada a f()). A continuación, da un fragmento que no involucra g() en absoluto, y realmente no se relaciona ni con la primera frase de su pregunta, ni con el hilo de comentario con detly.
En caso de ir editando de nuevo, aquí está el fragmento que estoy respondiendo:
tengo:
a = f(Z)
if x:
return 5
elif y:
return a
elif z:
return h(a)
funciona el código, pero quiero reestructurarlo de manera que f (Z) es solo llamado si se usa el valor. No deseo querer cambiar la definición de f (...), y Z es un poco grande para caché.
Si ese es realmente su pregunta, entonces la respuesta es simplemente
if x:
return 5
elif y:
return f(Z)
elif z:
return h(f(Z))
Esa es la forma de lograr "f (Z) sólo se llama si se utiliza el valor".
No entiendo completamente "Z es un poco grande para caché". Si quiere decir que habrá demasiados valores diferentes de Z en el curso de la ejecución del programa, que la memorización es inútil, entonces tal vez tenga que recurrir a precalcular todos los valores de f (Z) y simplemente buscarlos en el tiempo de ejecución. Si no puede hacer esto (porque no puede conocer los valores de Z que encontrará su programa), entonces ha vuelto a la memorización. Si todavía es demasiado lento, entonces tu única opción real es usar algo más rápido que Python (prueba Psyco, Cython, ShedSkin o el módulo C codificado a mano).
No estoy seguro de que esto es lo que generalmente se entiende por * lazy *. Más seguro llamarlo * almacenamiento en caché * o * memoización *. –
@John Y tiene razón: "evaluación diferida" se refiere a no computar el resultado de expresiones que no afectarán el resultado de la expresión que contiene, ej. en 'f() y g()', una evaluación diferida no llamará 'g()' si 'f()' es 'False'. Esta pregunta no es sobre eso. – detly
es memoialización cuando hay argumentos de función. De lo contrario, es solo una llamada de función perezosa. –