2011-12-17 19 views
12

Recibí el siguiente fragmento de código del sitio web de Peter Norvig; es un decorador para permitir la memorización de llamadas a funciones (caché de llamadas previas a la función para cambiar una recursión exponencial en un programa dinámico simple).¿Por qué es necesaria una línea en esta función python? (recursividad memorable)

def memo(f): 
    table = {} 
    def fmemo(*args): 
     if args not in table: 
      table[args] = f(*args) 
     return table[args] 
    fmemo.memo = table 
    return fmemo 

El código funciona bien, pero me pregunto por qué es necesaria la penúltima línea. Esto es claramente un vacío en mi conocimiento de Python, pero al eliminar la línea y ejecutar una función simple de Fibonacci, parece que todavía funciona. ¿Tiene esto que ver con memorizar múltiples funciones simultáneamente? ¿Por qué la variable miembro de fmemo se llama memo (suponiendo que no sea una coincidencia incómoda)?

Gracias!

+0

sangría de su código no se ve bien. ¿Es eso una función anidada? – MAK

+0

FTFY ........... – katrielalex

+1

Por cierto, esto se ha implementado en Python 3.2 como ['functools.lru_cache'] (http://docs.python.org/dev/library/functools.html#functools .lru_cache). – katrielalex

Respuesta

12

Dado que las funciones son objetos como cualquier otra cosa, puede establecer atributos en ellos. Ver:

>>> def foo(): pass 
>>> foo.x = 1 
>>> foo.x 
1 

El segundo-a-línea establece la caché interna de los valores como un atributo en el objeto función, exponiendo así a ella. Esto significa que puede tomar una función memorada y jugar con su caché, sin tener que llamarlo. Esto podría ser conveniente.


Ejemplo:

>>> @memo 
... def id(x): return x 
>>> id(1) 
1 
>>> id(2) 
2 
>>> id.memo 
{(2,): 2, (1,): 1} 
+3

Agregaría a esto que no es * necesario *, debido al cierre. Como dices, la capacidad de inmiscuirse o acceder a los valores sin necesidad de llamarlo será lo más importante. –

+0

De hecho, la variable 'table' cerrada también nombra el caché (que en realidad es problemático si' memo' se reasigna fuera) ... pero +1. –

+0

De hecho, reasignar 'memo' sería malo. – katrielalex

Cuestiones relacionadas