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 のものです。