2012-09-06 11 views
5

Mientras que va el desarrollo de OpenERP, me encontré con el siguiente fragmento de códigoEl uso de lambda en la siguiente expresión

'app_date': lambda *a: time.strftime('%Y-%m-%d')

sé qué pregunta lambda is.My es por qué el uso de lambda? ¿Por qué no

'app_date': time.strftime('%Y-%m-%d')

Respuesta

13

'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} 
+2

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

+0

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