py3.2 *和* py3.5中生成器的返回值

时间:2016-01-14 08:24:40

标签: python generator yield stopiteration

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

0 个答案:

没有答案