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