[Twisted-Python] A Python metaclass for Twisted allowing __init__ to return a Deferred

Esteve Fernandez esteve at sindominio.net
Mon Nov 3 05:20:25 EST 2008


On Monday 03 November 2008 00:48:20 Terry Jones wrote:
> I just posted a blog article with title as above: http://bit.ly/1whZUK

I'm going to jump in. How about this:

from twisted.internet import defer, reactor

def aFuncReturningADeferred(value):
    d = defer.Deferred()
    reactor.callLater(5, d.callback, value[::-1])
    return d

class Foo(object):

    def __new__(cls, value):
        def cb(x):
            obj = object.__new__(cls, x)
            obj.__init__(x)
            return obj
        return aFuncReturningADeferred(value).addCallback(cb)

    def __init__(self, value):
        self.value = value

def printFoo(obj):
    print obj.value
    reactor.stop()

d = Foo("Some value")
d.addCallback(printFoo)

reactor.run()

Instead of returning a deferred from the __init__ method (which is 
non-standard), you return it from __new__

It's clearer, since __init__ is meant for configuring instances, and __new__ 
for instantiating objects.

Cheers.




More information about the Twisted-Python mailing list