[Twisted-Python] A kinder and more consistent defer.inlineCallbacks
glyph at divmod.com
glyph at divmod.com
Sat Nov 22 22:40:46 EST 2008
On 22 Nov, 05:50 pm, terry at jon.es wrote:
>Agreed. I also agree with your earlier remarks about dropping the
>isinstance(result, GeneratorType). That leaves me with an alternative:
>
> def altInlineCallbacks(f):
> def unwindGenerator(*args, **kwargs):
> try:
> result = f(*args, **kwargs)
> except Exception, e:
> # f was not a generator.
> return failure.Failure()
^
I hope you mean "defer.fail()".
>and still the problem that _inlineCallbacks raises if result doesn't
>have a
>send() method, etc. I'm also not sure of the best way to check for
>that,
>but don't think it should be in the _inlineCallbacks loop.
As with the other case we mistakenly diagnosed here, it doesn't actually
raise. It returns a failed Deferred. Consider:
from twisted.internet.defer import inlineCallbacks
@inlineCallbacks
def notDeferred():
return object()
def ok(result):
ae = result.trap(AttributeError)
print 'OK', ae
notDeferred().addErrback(ok)
The only thing that (potentially) needs to be done here is to produce a
more useful error message. The other case, where inlineCallbacks
decorates a function that itself raises an exception rather than returns
an object, is the only way you won't get a Deferred.
More information about the Twisted-Python
mailing list