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