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

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

Ответ 1

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

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

Ответ 2

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

{valid: true, data: whatyouwanttostore}

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

Ответ 3

Не совсем.

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

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