Что если я хочу сохранить значение None в memcache? - PullRequest
10 голосов
/ 22 мая 2009

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

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

Ответы [ 3 ]

7 голосов
/ 22 мая 2009

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

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

4 голосов
/ 28 мая 2009

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

{valid: true, data: whatyouwanttostore}

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

0 голосов
/ 22 мая 2009

Не совсем.

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

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

...