[Twisted-Python] A Python metaclass for Twisted allowing __init__ to return a Deferred
Terry Jones
terry at jon.es
Mon Nov 3 08:11:05 EST 2008
>>>>> "Esteve" == Esteve Fernandez <esteve at sindominio.net> writes:
Esteve> I'm going to jump in. How about this:
That's nice. But you've coupled the args to aFuncReturningADeferred and
what it's Deferred ends up returning to the args for __init__ of the class.
I think you meant 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, *args, **kw):
def cb(x):
obj = object.__new__(cls)
obj.__init__(*args, **kw)
return obj
return aFuncReturningADeferred("Some value").addCallback(cb)
def __init__(self, value):
self.value = value
def printFoo(obj):
print obj.value
reactor.stop()
d = Foo("Some other value")
d.addCallback(printFoo)
reactor.run()
I.e., __new__ can do whatever it likes with preparing args for
aFuncReturningADeferred (including using args and kw), and all of the args
to __new__ are passed to __init__, as the caller would expect from a normal
class. You're passing the return result of the Deferred as the single arg
to __init__.
Anyway, I like it more than my solution.
Terry
More information about the Twisted-Python
mailing list