我注意到这两个代码块之间的行为存在差异,但根据我对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
执行第二个参数吗?它无论如何都会被执行。
我没有使用特殊设置,因此默认缓存后端适用。
答案 0 :(得分:1)
不:这是完全正常的函数调用语义。
为了让Python调用函数 - 在本例中为cache.get()
- 它需要知道其所有参数的值。如果其中一个参数本身是一个函数调用,那么在调用外部函数之前,必须进行该调用以解析该值。
(注意,可以编写一个接受可调用函数的函数 - 例如,get_cm_subscribers_from_api
没有调用括号 - 并且函数可以确定该参数是可调用的,并且仅在必要时调用它。但这取决于函数的编写者,并且不会影响调用代码。)