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 :)