Python 3.6では、コルーチン内でyield
を使用できますが、yield from
は使用できません。
以下は私のコードです。 3行目で、別のコルーチンを待ちます。 4行目で、ファイルをyield from
しようとします。 Python 3.6でそれができないのはなぜですか?
async def read_file(self, filename):
with tempfile.NamedTemporaryFile(mode='r', delete=True, dir='/tmp', prefix='sftp') as tmp_file:
await self.copy_file(filename, tmp_file)
yield from open(tmp_file)
ここに例外がありますPython 3.6上記のコードのレイズ:
File "example.py", line 4
yield from open(tmp_file)
^
SyntaxError: 'yield from' inside async function
PEP 525 によると、Python 3.6に非同期ジェネレーターが導入されています:
非同期
yield from
理論的には非同期ジェネレーターの
yield from
サポートを実装することは可能ですが、ジェネレーターの実装を大幅に再設計する必要があります。コルーチンの上に別のコルーチンプロトコルを実装するメカニズムを提供する必要がないため、
yield from
も非同期ジェネレーターにとってそれほど重要ではありません。非同期ジェネレーターを構成するには、単純なasync for
ループを使用できます。async def g1(): yield 1 yield 2 async def g2(): async for v in g1(): yield v
ご覧のように、答えは「実装するのが難しすぎて、とにかく必要ない」ということになります。