Voici un décorateur de cache simple. Il ne tient pas compte des variations de paramètres, il renvoie juste le même résultat après le premier appel. Il y a des colombophiles là-bas qui mettent en cache le résultat pour chaque combinaison d'entrées ("memoization").
import functools
def callonce(func):
result = []
@functools.wraps(func)
def wrapper(*args, **kwargs):
if not result:
result.append(func(*args, **kwargs))
return result[0]
return wrapper
Utilisation:
@callonce
def long_running_function(x, y, z):
# do something expensive with x, y, and z, producing result
return result
Si vous préférez écrire votre fonction en tant que générateur pour une raison quelconque (peut-être le résultat est légèrement différent sur chaque appel, mais il y a encore une configuration initiale du temps , ou bien vous voulez simplement des variables statiques de type C qui permettent à votre fonction de se rappeler un peu peu de l'état d'un appel à l'autre), vous pouvez utiliser ce décorateur:
import functools
def gen2func(generator):
gen = []
@functools.wraps(generator)
def wrapper(*args, **kwargs):
if not gen:
gen.append(generator(*args, **kwargs))
return next(gen[0])
return wrapper
utilisation:
@gen2func
def long_running_function_in_generator_form(x, y, z):
# do something expensive with x, y, and z, producing result
while True:
yield result
result += 1 # for example
A Python 2.5 ou version ultérieure qui utilise .send()
pour permettre les paramètres à transmettre à chaque itération du générateur est comme suit (notez que **kwargs
ne sont pas pris en charge):
import functools
def gen2func(generator):
gen = []
@functools.wraps(generator)
def wrapper(*args):
if not gen:
gen.append(generator(*args))
return next(gen[0])
return gen[0].send(args)
return wrapper
@gen2func
def function_with_static_vars(a, b, c):
# time-consuming initial setup goes here
# also initialize any "static" vars here
while True:
# do something with a, b, c
a, b, c = yield # get next a, b, c
Pourquoi ne pas simplement cache le résultat dans une variable ou un attribut de fonction? Ou consultez l'une des recettes de mémo de Python que vous pouvez trouver via Google. – user2357112
@ user2357112 Noté. Les deux ont été mentionnés dans les réponses. – 2rs2ts
Je n'arrive pas à comprendre votre nom, y at-il quelque chose que je ne reçois pas? Trop à ts?, C'est 2complicated4me – Stephan