None でない場合にのみ、関数の戻り値をキャッシュしようとしています。
次の例では、 someFunction が some-url から 1 時間データを取得できた場合に備えて、 someFunction の結果をキャッシュするのが理にかなっています。
データを取得できなかった場合、結果を 1 時間 (またはそれ以上) キャッシュするのは意味がありませんが、おそらく 5 分間はキャッシュします (したがって、some-domain.com のサーバーが復旧する時間があります)。
def _cachekey(method, self, lang):
return (lang, time.time() // (60 * 60))
@ram.cache(_cachekey)
def someFunction(self, lang='en'):
data = urllib2.urlopen('http://some-url.com/data.txt', timeout=10).read()
except socket.timeout:
data = None
except urllib2.URLError:
data = None
return expensive_compute(data)
_cachekey を呼び出しmethod(self, lang)
てもあまり意味がありません。