为什么我不能从'异步函数内'中获益?

Aki*_*esh 15 python python-3.x async-await python-asyncio python-3.6

在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)
Run Code Online (Sandbox Code Playgroud)

以下是Python 3.6为上述代码引发的异常:

  File "example.py", line 4
    yield from open(tmp_file)
    ^
SyntaxError: 'yield from' inside async function
Run Code Online (Sandbox Code Playgroud)

Zer*_*eus 19

根据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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,答案归结为"实施起来太难了,而且无论如何都不需要它".

  • 不过,您确实需要它,以透明地委托给子生成器,从而充分发挥yield 表达式的功能(即接收值并生成值)。如果没有“yield from”,那么将生成的值传递给调用者、将接收到的值传递给子生成器以及处理所有特殊异常就会变得一团糟。 (14认同)