
Aug. 26, 2010
10:51 a.m.
Yes, I was expecting you to wrap item.obsolete() and renew(data) in try/except, as needed. If you want a clean but slightly slower way to do that, how about something like:
def getCachedResult(cache, key):
def release(result, item): item.release() return result
def renew(data): return renew(data)
def notFound(fail): fail.trap(NotFound)
def readItem(item): return item.read()
def checkObsolete(item): d = defer.maybeDeferred(item.obsolete) d.addCallback(lambda _: readItem(item)) d.addBoth(release, item) d.addCallback(renew) return d
d = cache.open(key) d.addCallbacks(checkObsolete, notFound) return d
Thanks, maybeDeferred is what I missed :)