On Fri, 6 Mar 2009 12:10:55 +0100, Terry Jones <[email protected]> wrote:
Here are a few comments on deferreds. I'll keep this short. These sort of
posts don't seem to generate much/any discussion (e.g., http://bit.ly/YkSD
which I thought was cool). I'm not sure why - I find deferreds infinitely
interesting, and don't understand why other people don't seem to share the
passion :-)

1. If you have a deferred d1, and you call d1.chainDeferred(d2) I think it
  makes sense for there to be a flag inside the deferred class that warns
  you if you later call d1.addCallbacks. That's because adding more
  functions to d1's callback/errback chain is probably not useful. (It
  might conceivably be useful, e.g., to let you know that d1 has been
  called). The result of d1 has been passed to d2, and because d2.callback
  and d2.errback don't return it (see point 2 below), it is not passed
  further down d1's chain. So it's most likely that someone adding a
  callback to d1 after calling d1.chainDeferred doesn't really know what
  they're doing.

Indeed.  I can't think of any case where I've wanted to add more callbacks
to a Deferred after chaining it to (from?  with?) another Deferred.

2. Deferred.callback and Deferred.errback currently (implicitly) return
  None.  They could be changed to return their passed argument.  That
  would make a call to d1.chainDeferred act like a deferred fork - the
  result would go down d2's callback chain, but also continue down the
  callback/errback chain of d1.

But it would be catastrophic for error handling.  Suddenly all of your
errors on d1 which are handled perfectly correctly with an errback on
d2 would become unhandled failures.

3. There's also the possibility of adding a function to the Deferred class:

    def incorporateDeferred(self, d2):
        self.callbacks.extend(d2.callbacks)

  which might be what a naive reader might expect chainDeferred to do.
  This raises the question of what you might later do with d2 (probably
  nothing), but that's just like what happens with d1: if you call
  d1.chainDeferred you're probably not going to return d1 to anyone. All
  you can usefully do is fire it.

If this accounted for future changes to d2, it would make more sense.  I
think the correct direction to go in is to prevent people from trying to
add more callbacks to d1.

I'll stop for now. There's lots more that could be said, but lets see if
anyone's interested. I wish I were going to PyCon :-(

BTW, points 1 and 2 above are key to understanding what goes on in the
interview question code I recently posted (http://bit.ly/T3xKs).


Jean-Paul

_______________________________________________
Twisted-Python mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to