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. Chaz 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@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python