0

在 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没有值。

4

0 回答 0