web-dev-qa-db-ja.com

なぜ非同期関数内で「yield from」できないのですか?

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
19
Akilesh

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

ご覧のように、答えは「実装するのが難しすぎて、とにかく必要ない」ということになります。

17
Zero Piraeus