0

Python 3.3 以降では、ジェネレーターから値を返すことができます。Tornado でこれを使用してtranslate_part、メイン スレッドをブロックせずに、また複数の big&slow 関数を同時に実行することなく、大きくて遅いサブプロセス (以下) を呼び出す関数を作成します。

@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)

動作しません。これに対する見苦しくない解決策はありますか、それとも 2 つのバージョンを維持する必要がありますか?

https://www.python.org/dev/peps/pep-0479/は、下位互換性を保つのは簡単だと主張していますが、それらの例はすべて値のないStopIteration の/return のものです。

4

0 に答える 0