Re: [Twisted-Python] help with Deferreds

Hi Sergey
def checkObsolete(item): if item.obsolete(): return None else: d = item.read() d.addBoth(release, item) d.addCallback(renew) return d
d = cache.open(key) d.addCallbacks(checkObsolete, notFound) return d
Hi Terry If item.obsolete() raise exception item remain not released. Additional try ... except ... safe us but looks ugly
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

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 :)
participants (2)
-
Sergey Magafurov
-
Terry Jones