这条款工作正常:
if cache.get(cache_name):
events = cache.get(cache_name)
else:
events = self.get_google_events()
cache.set(cache_name, events, 60 * 10)
Run Code Online (Sandbox Code Playgroud)
如果我输入一个print语句get_google_events(),只有在缓存过期时才会打印,如预期的那样.但如果我试图将上述内容缩短到这个:
events = cache.get_or_set(cache_name, self.get_google_events(), 60 * 10)
Run Code Online (Sandbox Code Playgroud)
每次都会触发print语句(即缓存被静默打破).第二种形式不是第一种形式吗?
一点都不.在调用函数本身之前,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)
Run Code Online (Sandbox Code Playgroud)
解决方案是不调用该函数(没有())。\n在您的情况下,它是:
\nevents = cache.get_or_set(cache_name, self.get_google_events, 60 * 10)\nRun Code Online (Sandbox Code Playgroud)\n您可以使用 django 文档中的示例进行测试
\nimport datetime\nfrom django.core.cache import cache\n\ncache.get_or_set(\'some-timestamp-key\', datetime.datetime.now)\n\n>> datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)\nRun Code Online (Sandbox Code Playgroud)\n你通常用datetime.datetime.now()来调用它
\n\n| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |