2012-09-06 11 views
5

Mentre andando in via di sviluppo OpenERP, ho trovato il seguente pezzo di codiceL'uso della lambda nella seguente espressione

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

so cosa lambda is.My domanda è perché l'uso lambda? Perché non basta

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

risposta

13

'app_date': time.strftime('%Y-%m-%d') valuterà immediatamente lo time.strftime. Se lo avvolge in una lambda, la sua esecuzione viene posticipata più tardi (il momento in cui si chiama la lambda). In parole povere, la differenza è tra "il tempo in cui ho definito questo" e "il momento in cui sto usando questo". Guardate:

>>> 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) 

ho permesso po 'di tempo che deve trascorrere tra ogni d['a'], d['b'](). Notare che d['a'] è sempre lo stesso: è l'ora in cui ho definito d. d['b'] è una funzione. d['b']() (con parentesi) chiama la funzione, che valuta di nuovo l'ora di ogni chiamata, quindi è diversa a ogni utilizzo.

Inoltre, questo non è niente di speciale su lambda. Lambdas sono solo funzioni come le altre. Potrei fare lo stesso con:

def func(): 
    return time.time() 
d = {'a': time.time(), 'b': func} 
+2

Infatti, ed è un errore comune nei valori di default per i modelli OpenERP. La maggior parte dei valori predefiniti di OpenERP può essere stringhe letterali semplici/interi/booleani, ma quelli di data e ora devono essere racchiusi in un callable, altrimenti il ​​valore predefinito sarà sempre la data e l'ora di avvio del server e non l'ora corrente. – odony

+0

Vedere http: //en.wikipedia.org/wiki/Thunk_(functional_programming). Ho solo sentito il termine "thunk" nel contesto di una valutazione pigra ispirata alle prestazioni, ma potrebbe applicarsi anche a questo esempio relativo al tempo. Qualcuno lo sa? – stalepretzel