这与Google App Engine Memcache API特别相关,但我确信它也适用于其他Memcache工具。
字典.get()方法允许您指定默认值,例如dict.get('key','defaultval')
如果您可能希望将None存储为字典中的值,则此功能非常有用。
但是,memcache.get()不允许你这样做。我修改了我的@memoize装饰器,看起来像这样:
def memoize(keyformat, time=1000000):
"""Decorator to memoize functions using memcache."""
def decorator(fxn):
def wrapper(*args, **kwargs):
key = keyformat + str(args[1:]) + str(kwargs)
from google.appengine.api import memcache
data = memcache.get(key)
if Debug(): return fxn(*args, **kwargs)
if data:
if data is 'None': data = None
return data
data = fxn(*args, **kwargs)
if data is None: data = 'None'
memcache.set(key, data, time)
return data
return wrapper
return decorator
现在我确信有一个很好的论据,我不应该首先存储None值,但是现在让我们把它放在一边。除了将无val转换为字符串并返回之外,还有更好的方法可以解决这个问题吗?
答案 0 :(得分:7)
执行此操作的一种可能方法是创建为此目的定义None
的新类,并将其实例分配给缓存(遗憾的是,您无法扩展None
)。或者,您可以使用空字符串“”,或者完全避免存储None / null值(缺少键意味着None)。
然后在检查mc.get(key)
(is None
,== ""
等的结果时检查“无”课程的实例
答案 1 :(得分:4)
您可以执行类似Haskell和Scala的操作并存储Option字典。该字典包含两个键:一个键表示它是有效的,一个键用于保存数据。像这样:
{valid: true, data: whatyouwanttostore}
然后,如果get
返回None,则表示错过了缓存;如果结果是包含None作为数据的字典,则您知道数据在缓存中但是它是错误的。
答案 2 :(得分:0)
不是。
您可以将None值存储为空字符串,但实际上没有办法在memcache中存储特殊数据。
缓存密钥不存在与缓存值为None之间有什么区别?统一这两种情况可能更好。