'app_date': time.strftime('%Y-%m-%d')
evaluará el time.strftime
inmediatamente. Al envolverlo en una lambda, su ejecución se pospone hasta más tarde (el momento en que llama a la lambda). A grandes rasgos, la diferencia está entre "el momento en que lo definí" y "el momento en que estoy usando esto". Mira:
>>> d = {'a': time.time(), 'b': lambda: time.time()}
>>> d['a'], d['b']()
(1346913545.049, 1346913552.409)
>>> d['a'], d['b']()
(1346913545.049, 1346913554.518)
>>> d['a'], d['b']()
(1346913545.049, 1346913566.08)
me permite algo de tiempo que debe transcurrir entre cada d['a'], d['b']()
. Tenga en cuenta que d['a']
es siempre el mismo: es el momento en que definí d
. d['b']
es una función. d['b']()
(con paréntesis) llama a la función, que evalúa el tiempo de nuevo en cada llamada, por lo que es diferente en cada uso.
Además, esto no tiene nada de especial en lambda
. Lambdas son solo funciones como cualquier otra. Podría hacer lo mismo con:
def func():
return time.time()
d = {'a': time.time(), 'b': func}
De hecho, es un error común en los valores predeterminados para los modelos OpenERP. La mayoría de los valores predeterminados de OpenERP pueden ser simples cadenas literales/enteros/booleanos, pero los de fecha y hora deben estar envueltos en un invocable, de lo contrario el valor predeterminado será siempre la fecha y hora de inicio del servidor, y no la hora actual. – odony
Ver http: //en.wikipedia.org/wiki/Thunk_(functional_programming). Solo escuché el término "thunk" en el contexto de la evaluación perezosa inspirada en el rendimiento, pero también puede aplicarse a este ejemplo relacionado con el tiempo. ¿Alguien sabe? – stalepretzel