python - How to write a method decorated with @defer.inlineCallbacks that may or may not yield? -
my method of following form:
@defer.inlinecallbacks def myasyncmethod(): if somecondition: yield anotherasyncmethod()
the problem if somecondition
not true
no yield happens , becomes synchronous function. decorator causes error.
right now, doing yield 1
@ end of it. right thing here? of course do:
d = deferred() d.callback(0) yield d
but don't see how different
edit: meant here if try yield myasyncmethod()
generate exception. dont want have handle exception. 1 way avoid yield @ end of myasyncmethod(), there no-hacky way of doing this. common practice here?
the premise incorrect. consider:
>>> def foo(): ... if false: ... yield ... >>> foo() <generator object foo @ 0x7f579cc4ccd0> >>>
here, yield statement never evaluated. doesn't stop foo
returning generator, though.
this means can decorate such function inlinecallbacks
without problem.
>>> @inlinecallbacks ... def foo(): ... if false: ... yield ... >>> foo() <deferred @ 0x7f08328e3ef0 current result: none> >>>
since generator has no elements, deferred
has none
result, can see here.
further, means can call such function , yield inlinecallbacks
-decorated function without problems:
>>> @inlinecallbacks ... def bar(): ... print "foo result is:", (yield foo()) ... >>> bar() foo result is: none <deferred @ 0x7f08328e3ef0 current result: none> >>>
here see bar
executed, yielded result of calling foo
, printed out result of deferred
, , completed own deferred
(which has none
result).
Comments
Post a Comment