2012-09-06 51 views
5

雖然會發展的OpenERP,我發現下面的代碼在下面的表達式中使用的λ的

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

我知道拉姆達is.My問題是爲什麼使用拉姆達?爲什麼不

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

回答

13

'app_date': time.strftime('%Y-%m-%d')將立即評估time.strftime。通過將它包裝到一個lambda表達式中,它的執行被推遲到以後(當你調用lambda時)。粗略地說,區別在於「我定義這個時間的時間」和「我使用這個時間的時間」。看:

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

我允許一段時間過去了在每個d['a'], d['b']()之間。請注意0​​總是相同的:現在是我定義d的時間。 d['b']是一個函數。 d['b']()(帶圓括號)調用函數,該函數在每次調用時重新計算時間,因此在每次使用時不同。

此外,這對lambda沒什麼特別的。 Lambdas只是其他任何功能。我可以這樣做:

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

事實上,這是OpenERP模型默認值中常見的陷阱。大多數OpenERP默認值可以是簡單的文字字符串/整數/布爾值,但是日期時間的值需要被包裝成可調用的,否則默認的valye將始終是服務器啓動日期和時間,而不是當前時間。 – odony

+0

請參見http: //en.wikipedia.org/wiki/Thunk_(functional_programming)。我只是在性能啓發懶惰評估的背景下聽到了「thunk」這個詞,但它也可能適用於這個與時間有關的例子。有人知道嗎? – stalepretzel

相關問題