为什么`async def`协程函数不能包含任何`yield`?

时间:2017-10-19 01:51:23

标签: python python-3.x

从Nutshell中的Python,为什么会这样呢

  

async def协同程序函数不能包含任何yield

感谢。

1 个答案:

答案 0 :(得分:3)

PEP 492引用async / await并禁止在其中使用yield的理由中说明了这一点:

  

当前的Python支持通过生成器实现协同程序(PEP   342),通过PEP 380中引入的语法的产量进一步增强。   这种方法有许多缺点:

     
      
  • 很容易将协同程序与常规发生器混淆,因为它们   分享相同的语法;对于新开发者来说尤其如此。

  •   
  • 函数是否是协程是由存在决定的   从其身体中的陈述中得出的收益率或收益率,这可能导致   当这些陈述出现或消失时,不明显的错误   重构过程中的函数体。

  •   
  • 支持异步调用   仅限于在语法上允许产量的表达式,限制   句法特征的有用性,例如with和for语句。

  •   

这仅适用于Python 3.5

在Python 3.6中,PEP 525出现并用异步生成器解除了禁令。现在在异步def函数中使用yield会导致创建异步生成器。