5
雖然會發展的OpenERP,我發現下面的代碼在下面的表達式中使用的λ的
'app_date': lambda *a: time.strftime('%Y-%m-%d')
我知道拉姆達is.My問題是爲什麼使用拉姆達?爲什麼不
'app_date': time.strftime('%Y-%m-%d')
雖然會發展的OpenERP,我發現下面的代碼在下面的表達式中使用的λ的
'app_date': lambda *a: time.strftime('%Y-%m-%d')
我知道拉姆達is.My問題是爲什麼使用拉姆達?爲什麼不
'app_date': time.strftime('%Y-%m-%d')
'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}
事實上,這是OpenERP模型默認值中常見的陷阱。大多數OpenERP默認值可以是簡單的文字字符串/整數/布爾值,但是日期時間的值需要被包裝成可調用的,否則默認的valye將始終是服務器啓動日期和時間,而不是當前時間。 – odony
請參見http: //en.wikipedia.org/wiki/Thunk_(functional_programming)。我只是在性能啓發懶惰評估的背景下聽到了「thunk」這個詞,但它也可能適用於這個與時間有關的例子。有人知道嗎? – stalepretzel