python-3.x 为什么`async def`协程函数不能包含任何`yield`?

9jyewag0  于 2023-05-02  发布在  Python
关注(0)|答案(1)|浏览(156)

从Python in a Nutshell,为什么它是
async def协程函数不能包含任何yield
谢谢。

oxcyiej7

oxcyiej71#

这在PEP 492的基本原理中有所说明,PEP 492引入了async/await并禁止在其中使用yield
当前的Python支持通过生成器(PEP 342)实现协程,通过PEP 380引入的语法的收益率进一步增强。这种方法有许多缺点:

  • 协同程序很容易与常规生成器混淆,因为它们共享相同的语法;这对于新开发者尤其如此。
  • 一个函数是否是协程取决于其函数体中是否存在yield或yield from语句,当这些语句在重构过程中出现在函数体中或从函数体中消失时,可能会导致不明显的错误。
  • 对异步调用的支持仅限于在语法上允许yield的表达式,从而限制了语法功能(如with和for语句)的实用性。

这只适用于Python 3。5
在Python 3中。6,PEP 525沿着并取消了异步发电机的禁令。现在,在async def函数中使用yield会创建一个异步生成器。

相关问题