[Twisted-Python] deferred object inside function

Chaz. eprparadocs at gmail.com
Fri Jul 7 07:07:57 EDT 2006

Boy no one seemed to offer the answer. What will happen in your code, if
I am not mistaken, is that somefunct1() will be called with the results
of the resolver. In essense r.resolve() when it returns the deferred
promises to invoke one of the callbacks (either the normal one or error
one). To that call back it will supply an appropriate argument.

You should do a 'return d' from your function. Anyone that issues a
Callback against that deferred will be invoked only if your function
somefunct() uses the defer.

Hope that helps. If not, send me a private email and I can help you get it.


Robert Gravina wrote:
>> Yusnel Rojas García wrote:
>>> how can I make a function which have a deferred object return a value
>>> that
>>> depends of the deferred object's result.
>>> example:
>>> how can get the result from the resolver?
>>> from twisted.names import client, dns
>>> def somefunction(somepars):
>>>       r  = client.Resolver('/etc/resolv.conf')
>>>       d = r.resolve(dns.Query('www.example.com', dns.MX, dns.IN))
>>>       d.Callbacks(somefunct1, somefunctErr2)
>>>       return ?
>> Have you read the docs on deferreds? There's a bunch of good ones now,
>> and you can get to them here:
>>   http://twistedmatrix.com/projects/core/documentation/howto/index.html
> Yes, I think
> http://twistedmatrix.com/projects/core/documentation/howto/defer.html is
> a good place to start also.
> While I'm no Twisted expert, I think the main point of confusion you are
> having is here:
> d.Callbacks(somefunct1, somefunctErr2)
> return ?
> The great thing about Deferreds (and Twisted) is that it is asynchronous
> - that means that calls like your DNS query are non-blocking - in other
> words, your program doesn't sit around and wait while the DNS query is
> happening. I think you are expecting your program to wait until the DNS
> query is finished before getting to the "return" line... but it will
> keep on going, and later (at some time, maybe a few seconds later)
> either your "somefunct1" will be called if everything worked out, or
> your "somefunctErr2" will be called if there is an error. But, it will
> get to the return line probably before either of those two methods get
> called.
> I really do suggest working through the Twisted Howtos (they are
> *excellent*) and running the example code to see it in action. It helps
> a lot.
> Robert
>> In particular, you want the section on "Low-Level Networking and Event
>> Loop".
>> In your example above, you probably want this, instead:
>>   d.addCallbacks(yourCallback, yourErrback)
>> As for your question, see if this sums it up:
>> * You want some data
>> * The data depends upon the result
>> If that's correct, then you can only get your data in the callback.
>> Think about writing a class to handle this, and instead of having a
>> function return what you want, you could set a class attribute with the
>> data you're looking for once the callback is fired. Or any other of
>> hundreds of possible solutions ;-)
>> d
>> _______________________________________________
>> Twisted-Python mailing list
>> Twisted-Python at twistedmatrix.com
>> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

More information about the Twisted-Python mailing list