2009-05-21 12 views
10

Bu, özellikle Google App Engine Memcache API'sı ile ilgilidir, ancak diğer Memcache araçları için de geçerli olduğundan emin olabilirsiniz. eğer mümkünse bu yararlı olabilir böyle dict.get ('anahtar', 'defaultval')Memcache'de bir None değeri kaydetmek istersem ne olur?

olarak yöntem varsayılan bir değer belirlemenizi sağlar()

sözlük .get, Hiçbiri saklamak isteyebilirsiniz sözlükte bir değer olarak.

Ancak, memcache.get() bunu yapmanıza izin vermez. Şuna benzer yüzden benim @memoize dekoratör değiştirdik:

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 

Şimdi ben ilk etapta Yok değerlerini saklamak edilmemelidir iyi bir argüman var eminim ama en bunu bir kenara koyalım şimdi. Bunu yapmak için daha iyi bir yol var mı?

cevap

7

Bunu yapmanın olası bir yolu, bu amaç için None'u tanımlayan yeni bir sınıf oluşturmak ve bunun önbelleğine örneklerini atar (ne yazık ki None'u genişletemezsiniz). Alternatif olarak, boş dizgeyi "" kullanabilir veya Yok/boş değerlerin tümünü saklamaktan kaçınabilirsiniz (anahtarın yokluğu Yoktur). Eğer (vb is None, == "") mc.get(key) sonucunu kontrol ederken

Sonra

+0

Bence bu en iyi yaklaşım. Başka bir şey için karıştıramayacağınız bir sentinel değer verir. –

+0

Yaptığım şey bu. Teşekkürler! – jamtoday

0

değil gerçekten 'Yok' sınıfının örnekleri için kontrol edin.

Boş bir dize olarak bir Yok değeri depolayabilirsiniz, ancak özel verileri bir memcache'de saklamanın bir yolu yoktur.

Önbellek anahtarı mevcut değil ve önbellek değeri Yok olarak arasındaki fark nedir? Bu iki durumu birleştirmek muhtemelen daha iyidir.

+2

Aslında, onları ayırt etmek yararlı olabilir. Örneğin, kullanıcıların kimliğini doğrulamak için (pahalı) bir yol olduğunu ve sonuçların - kullanıcının ayrıntılarını - memcache'de önbelleğe aldığımı varsayalım. 'Böyle bir kullanıcı' yanıtını geri alırsam, muhtemelen bu olumsuz yanıtı önbelleğe almak isterim, ya da bir kullanıcı geçersiz kullanıcı adları ile tekrar tekrar giriş yapmaya çalışarak hizmetimi gerçekleştirebilir. –

+1

Bu, tam olarak, kendimi bulduğum durumun bir türüdür. Bazen, bir fonksiyonun 'Hiçbiri' döndürmediğini, ancak yine de yakın zamanda gerçekleştirilmemesi için yakın zamanda yapıldığını bilmek istersiniz. – jamtoday

3

Haskell ve Scala'nın bir Option sözlüğünü yaptığı ve depoladığı gibi bir şey yapabilirsiniz. Sözlük iki anahtar içerir: geçerli olduğunu ve verileri tutmak için kullanılan bir anahtar olduğunu belirten bir anahtar. Böyle bir şey:

{valid: true, data: whatyouwanttostore} 

Sonra get dönüş Yok, önbellek cevapsız olduğunu biliyorsanız; Sonuç, veri olarak Yok olan bir sözlük ise, verilerin önbellekte olduğunu ancak yanlış olduğunu biliyorsunuzdur.

İlgili konular