Что делать, если я хочу сохранить значение None в memcache?

это конкретно связано с Google App Engine Memcache API, но я уверен, что это также относится к другим инструментам Memcache.

словарь .метод get () позволяет указать значение по умолчанию, например dict.get ('key','defaultval')

Это может быть полезно, если возможно, что вы захотите сохранить None в качестве значения в словаре.

однако, memcache.get () не позволяет вам это делать. Я модифицировал мой @мемоизировать декоратор похоже это:

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 в первую очередь, но давайте отложим это пока. Есть ли лучший способ справиться с этим, кроме преобразования None vals в строки и обратно?

3 ответов


возможный способ сделать это-создать новый класс, который определяет None для этой цели и назначьте экземпляры этого кэша (к сожалению, вы не можете расширить None). Кроме того, вы можете использовать пустую строку "" или вообще не хранить значения None/null (отсутствие ключа подразумевает None).

затем проверьте экземпляры вашего класса "нет", когда вы проверяете результат mc.get(key) (is None, == "" и т. д.)


Вы можете сделать что-то вроде того, что делают Haskell и Scala, и сохранить словарь опций. Словарь содержит два ключа: один ключ, указывающий, что он действителен, и один ключ, используемый для хранения данных. Что-то вроде этого:--3-->

{valid: true, data: whatyouwanttostore}

тогда, если get return None, вы знаете, что Кэш был пропущен; если результатом является словарь с None в качестве данных, вы знаете, что данные были в кэше, но что это было false.


Не совсем так.

вы можете сохранить значение None как пустую строку, но на самом деле нет способа сохранить специальные данные в memcache.

в чем разница между ключом кэша, который не существует, и значением кэша None? Наверное, лучше объединить эти две ситуации.