在Python 3.3及更高版本中,您可以从生成器返回值;我们在Tornado中使用这个函数来调用大而慢的子进程(下面是translate_part
)而不阻塞主线程的函数,并且没有多个大和慢的函数同时运行:
@gen.coroutine
def translate(self, text, lock):
parts = yield [translate_part(part, lock) for part in splitup(text)]
retval = "".join(parts)
return retval
为了支持Python 3.2,我们将其更改为丑陋的,但相当于:
@gen.coroutine
def translate(self, text, lock):
parts = yield [translate_part(part, lock) for part in splitup(text)]
retval = "".join(parts)
raise StopIteration(retval)
但是,在Python 3.5之后,这是可以理解的。但是我们如何支持Python 3.5+和Python 3.2?
是不可能的 if sys.version_info.minor<3:
raise StopIteration(retval)
else:
return retval
因为Python 3.2在“return retval”上引发了SyntaxError,当然还有
try:
return retval
except SyntaxError:
raise StopIteration(retval)
不起作用。是否有一个非丑陋的解决方案,或者我们必须维护两个版本?
https://www.python.org/dev/peps/pep-0479/声称修复事物是向后兼容的很容易,但他们所有的例子都是StopIteration的/ return 没有值。