11 Stimmen

Was ist, wenn ich einen None-Wert im Memcache speichern möchte?

Dies ist speziell auf die Google App Engine Memcache API bezogen, aber ich bin mir sicher, dass es auch auf andere Memcache-Tools zutrifft.

Die Methode .get() des Wörterbuchs ermöglicht es Ihnen, einen Standardwert anzugeben, z. B. dict.get('Schlüssel', 'Standardwert')

Dies kann nützlich sein, wenn es möglich ist, dass Sie None als Wert in einem Wörterbuch speichern möchten.

Die memcache.get() Methode lässt Sie jedoch nicht dies tun. Ich habe meinen @memoize-Decorator so modifiziert, dass er folgendermaßen aussieht:

def memoize(keyformat, time=1000000):

    """Decorator zum Speichern von Funktionen mit dem 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  

Jetzt bin ich mir sicher, dass es ein gutes Argument gibt, dass ich keine None-Werte von vornherein speichern sollte, aber lassen wir das jetzt beiseite. Gibt es einen besseren Weg, dies zu handhaben, als None-Werte in Zeichenfolgen umzuwandeln und zurück?

7voto

Dana the Sane Punkte 14222

Ein möglicher Weg, dies zu tun, besteht darin, eine neue Klasse zu erstellen, die None für diesen Zweck definiert, und Instanzen davon dem Cache zuzuweisen (leider können Sie None nicht erweitern). Alternativ könnten Sie den leeren String "", verwenden oder ganz auf das Speichern von None-/Null-Werten verzichten (das Fehlen des Schlüssels impliziert None).

Überprüfen Sie dann Instanzen Ihrer 'None'-Klasse, wenn Sie das Ergebnis von mc.get(key) überprüfen (is None, == "", usw.)

5voto

tomjen Punkte 3685

Sie könnten etwas Ähnliches tun wie Haskell und Scala und ein Option-Dictionary speichern. Das Wörterbuch enthält zwei Schlüssel: einen Schlüssel, um anzuzeigen, dass es gültig ist, und einen Schlüssel, der zur Speicherung der Daten verwendet wird. Etwas wie dies:

{valid: true, data: wasduspeichernmöchtest}

Dann, wenn get None zurückgibt, wissen Sie, dass der Cache verfehlt wurde; wenn das Ergebnis ein Wörterbuch mit None als Daten ist, wissen Sie, dass die Daten im Cache waren, aber falsch waren.

0voto

habnabit Punkte 9240

Nicht wirklich.

Sie könnten einen None-Wert als leeren String speichern, aber es gibt keine Möglichkeit, spezielle Daten in einem Memcache zu speichern.

Was ist der Unterschied zwischen dem nicht vorhandenen Cache-Schlüssel und dem Cache-Wert None? Es ist wahrscheinlich besser, diese beiden Situationen zu vereinheitlichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X