Receita: Cache de Funções
Exemplo prático de uma função em Python que retorna uma outra função. Isto é possível porque funções em Python são elementos de primeira classe. Esta receita é uma função que recebe como parâmetro qualquer função (matemática) e retorna a mesma função do argumento com um cache associado para lembrar dos resultados calculados, o Cache é simplesmente um dicionário de argumentos da função com o valor calculado correspondende.
Código
1 def cache_f(f):
2 """Retorna uma funcao igual a 'f' mas com um cache associado.
3
4 Exemplo:
5 >>> f = cache_f(math.sin)
6 >>> f.cache
7 {}
8 >>> f(0)
9 0.0
10 >>> f(1)
11 0.8414709848078965
12 >>> f.cache
13 {(1,): 0.8414709848078965, (0,): 0.0}
14 """
15 def g(*args):
16 if args in g.cache:
17 return g.cache[args]
18 else:
19 g.cache[args] = f(*args)
20 return g.cache[args]
21 g.cache = {}
22 return g
A partir do Python 2.4 é possível aplicar esse cache através de um decorator, um exemplo pode ser encontrado em [http://wiki.python.org/moin/PythonDecoratorLibrary#head-11870a08b0fa59a8622201abfac735ea47ffade5 Python Decorator Library - Memoize].
Volta para CookBook.