2

我的方法是以下形式:

@defer.inlineCallbacks
def myAsyncMethod():
    if someCondition:
        yield anotherAsyncMethod()

问题是,如果someCondition不是,True则不会发生任何屈服,这实际上变成了一个同步函数。然后装饰器导致这是一个错误。

现在,我只是在做yield 1最后的事情。这是正确的做法吗?我当然可以这样做:

d = Deferred()
d.callback(0)
yield d

但我看不出有什么不同

编辑:我的意思是,如果我尝试这样做,yield myAsyncMethod()那么它会产生异常。我不想处理异常。避免它的一种方法是在 myAsyncMethod() 的末尾产生一些东西,但是是否有另一种简单的方法来做到这一点。这里的常见做法是什么?

4

1 回答 1

2

前提不正确。考虑:

>>> def foo():
...     if False:
...             yield
... 
>>> foo()
<generator object foo at 0x7f579cc4ccd0>
>>> 

在这里,从不评估 yield 语句。不过,这并不会停止foo返回生成器。

这意味着您可以inlineCallbacks毫无问题地装饰这样的功能。

>>> @inlineCallbacks
... def foo():
...     if False:
...             yield
... 
>>> foo()
<Deferred at 0x7f08328e3ef0  current result: None>
>>> 

由于生成器没有元素,因此您得到的结果Deferred是已经有的None,正如您在此处看到的那样。

此外,这意味着您可以调用这样的函数并从另一个inlineCallbacks-decorated 函数中生成它而不会出现问题:

>>> @inlineCallbacks
... def bar():
...     print "Foo result is:", (yield foo())
... 
>>> bar()
Foo result is: None
<Deferred at 0x7f08328e3ef0  current result: None>
>>> 

在这里,您看到bar执行,产生了调用的结果foo,打印出的结果,Deferred然后用它自己的完成Deferred(也已经有None结果)。

于 2013-04-18T19:02:29.797 回答