django的低级缓存中的默认值如何工作?

时间:2014-08-27 13:47:16

标签: python django caching

我注意到这两个代码块之间的行为存在差异,但根据我对django文档的理解,它们应该是相同的。

utils.py

from django.core.cache import cache
import logging

def get_cm_subscribers_from_api():
    logger.info('Missed the cache.')
    cm_subscribers = [u'someone@example.com', u'someonelse@example.com']
    cache.set('cm_subscribers', cm_subscribers, 30)
    return cm_subscribers


def get_cm_subscribers_version1():
    cm_subscribers = cache.get('cm_subscribers')
    if not cm_subscribers:
        cm_subscribers = get_cm_subscribers_from_api()
    return cm_subscribers


def get_cm_subscribers_version2():
    cm_subscribers = cache.get('cm_subscribers', get_cm_subscribers_from_api())
    return cm_subscribers

在交互式翻译中我这样做:

>>> from utils import get_cm_subscribers_version1, get_cm_subscribers_version2
>>> get_cm_subscribers_version1()
INFO: Missed the cache.
[u'someone@example.com', u'someonelse@example.com']
>>> get_cm_subscribers_version1()
[u'someone@example.com', u'someonelse@example.com']
#The second function keeps on missing the cache:
>>> get_cm_subscribers_version2()
INFO: Missed the cache.
[u'someone@example.com', u'someonelse@example.com']
>>> get_cm_subscribers_version2()
INFO: Missed the cache.
[u'someone@example.com', u'someonelse@example.com']

只有当密钥不存在于缓存中时,才会cache.get执行第二个参数吗?它无论如何都会被执行。

我没有使用特殊设置,因此默认缓存后端适用。

1 个答案:

答案 0 :(得分:1)

不:这是完全正常的函数调用语义。

为了让Python调用函数 - 在本例中为cache.get() - 它需要知道其所有参数的值。如果其中一个参数本身是一个函数调用,那么在调用外部函数之前,必须进行该调用以解析该值。

(注意,可以编写一个接受可调用函数的函数 - 例如,get_cm_subscribers_from_api没有调用括号 - 并且函数可以确定该参数是可调用的,并且仅在必要时调用它。但这取决于函数的编写者,并且不会影响调用代码。)