如何编写一个用@defer.inlineCallbacks会不会屈服?

2024-09-30 04:38:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我的方法如下:

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

问题是,如果someCondition不是True,那么就没有屈服,这本质上变成了一个同步函数。装饰器会导致这是一个错误。在

现在,我正在做yield 1的结尾。在这里这样做对吗? 我当然可以:

^{pr2}$

但我看不出有什么不同

编辑:我这里的意思是,如果我尝试做yield myAsyncMethod(),那么它将生成一个异常。我不想处理这个异常。避免这种情况的一种方法是在myAsyncMethod()的末尾生成一些内容,但是有没有另一种简单的方法可以做到这一点呢。这里的常见做法是什么?在


Tags: 方法函数trueifdef装饰deferyield
1条回答
网友
1楼 · 发布于 2024-09-30 04:38:26

前提是不正确的。考虑:

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

在这里,不计算收益率声明。不过,这并不能阻止foo返回生成器。在

这意味着您可以用inlineCallbacks来修饰这样一个函数。在

^{pr2}$

由于生成器没有元素,因此返回的是一个Deferred,结果是已经有了{},如您在这里看到的。在

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

^{3}$

在这里您可以看到bar被执行,产生了调用foo的结果,输出了Deferred的结果,然后完成了它自己的Deferred(它也有一个None结果)。在

相关问题 更多 >

    热门问题