2016-11-23 231 views
1

這個子句工作正常:緩存結果()

if cache.get(cache_name): 
    events = cache.get(cache_name) 
else: 
    events = self.get_google_events() 
    cache.set(cache_name, events, 60 * 10) 

如果我把打印語句在get_google_events(),它僅在緩存過期印刷,符合市場預期。但是,如果我嘗試將上面的內容縮短爲:

events = cache.get_or_set(cache_name, self.get_google_events(), 60 * 10) 

每次都會觸發print語句(即緩存被無聲破壞)。第二種形式不等於第一種嗎?

回答

5

不,完全沒有。在調用函數本身之前,Python必須完整地評估構成函數參數一部分的表達式。在你的第二種情況下,這意味着self.get_google_events()將會調用總是,在get_or_set之前可以確定是否不從緩存中檢索值。

另請注意,您的第一個案例可以稍微更高效一些:您現在的方式是,您不必要地撥打get。相反,只需製作一個:

events = cache.get(cache_name) 
if not events: 
    events = self.get_google_events() 
    cache.set(cache_name, events, 60 * 10) 
+0

我明白了 - 我錯誤地認爲,如果cache_name存在,它什麼都不會做。但是,這只是python的工作原理。感謝您的明確解釋(以及縮短的版本)。 – shacker