此条款可以正常使用:
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()
中放置一个print语句,只有在缓存过期时才会打印出来,如预期的那样。但如果我试图将上述内容简化为:
events = cache.get_or_set(cache_name, self.get_google_events(), 60 * 10)
每次都会触发print语句(即缓存中的缓存)。第二种形式不是第一种形式吗?
答案 0 :(得分:7)
不,一点也不。在调用函数本身之前,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)
答案 1 :(得分:0)
解决方案是不调用函数(没有 () )。 在你的情况下是:
events = cache.get_or_set(cache_name, self.get_google_events, 60 * 10)
您可以使用 django 文档中的示例进行测试
import datetime
from django.core.cache import cache
cache.get_or_set('some-timestamp-key', datetime.datetime.now)
>> datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)
您通常使用 datetime.datetime.now()
调用它