Python 当我不';不需要收益率返回值吗?

Python 当我不';不需要收益率返回值吗?,python,scrapy,deferred,Python,Scrapy,Deferred,在刮擦的核心 ExecutionEngine方法启动 @defer.inlineCallbacks def start(self): """Start the execution engine""" assert not self.running, "Engine already running" self.start_time = time() yield self.signals.send_catch_log_deferred(signal=signals.

在刮擦的核心

ExecutionEngine方法启动


@defer.inlineCallbacks
def start(self):
    """Start the execution engine"""
    assert not self.running, "Engine already running"
    self.start_time = time()
    yield self.signals.send_catch_log_deferred(signal=signals.engine_started)
    self.running = True
    self._closewait = defer.Deferred()
    yield self._closewait
为什么不直接使用
self.signals.send\u catch\u log\u deferred(signal=signals.engine\u start)
 但不是收益

为什么不直接使用
self.signals.send\u catch\u log\u deferred(signal=signals.engine\u start)
 但不是收益

因为
send\u catch\u log\u deferred
返回一个
deferred
对象。如果要避免出现
收益率
,则应使用
send\u catch\u log
,但使用
send\u catch\u log\u deferred
的目的是允许侦听器返回
deferred
对象

使用
send\u catch\u log
的信号不能返回
延迟的对象,因此它们不允许执行异步操作


编辑:有关
inlineCallbacks
的详细介绍,请参见:

@defer。inlineCallbacks希望修饰函数是一个生成器函数,在修饰函数中调用生成器函数(甚至返回一个)不会使函数成为生成器函数。调查:

def gen():
    yield 1

def func(): return gen

import dis

dis.dis(gen)
  2           0 LOAD_CONST               1 (1)
              3 YIELD_VALUE         
              4 POP_TOP             
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE        

dis.dis(func)
  1           0 LOAD_GLOBAL              0 (gen)
              3 RETURN_VALUE        

import inspect

inspect.isgeneratorfunction(gen)
True

inspect.isgeneratorfunction(func)
False

所以满足@defer.inlineCallbacks的唯一方法是从self.signals.send\u catch\u log\u deferred(signal=signals.engine\u started)或从其他地方获得收益延迟