【问题标题】:Why can't I 'yield from' inside an async function?为什么我不能在异步函数中“屈服”?
【发布时间】:2018-05-02 18:01:29
【问题描述】:

在 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

【问题讨论】:

  • 是否可以使用 @asyncio.coroutine 装饰器在异步函数中启用“yield from”?来自 asyncio 文档:“@asyncio.coroutine¶ 装饰器来标记基于生成器的协程。这使生成器能够使用 yield from 来调用 async def 协程,并且还使生成器能够被 async def 协程调用,例如使用 await表达。”我不确定这是否适用于您上面编写的代码...

标签: python python-3.x async-await python-3.6 python-asyncio


【解决方案1】:

根据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

如您所见,答案归结为“实施起来太难了,而且您也不需要它”。

【讨论】:

    猜你喜欢
    • 2023-01-23
    • 2020-10-04
    • 2016-05-20
    • 2021-12-11
    • 2022-08-24
    • 2020-04-20
    • 2022-01-10
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多