在 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's/return's没有值。