为什么Python3.5有基于生成器的co例程?

为什么Python3.5有基于生成器的co例程?,python,generator,python-asyncio,coroutine,Python,Generator,Python Asyncio,Coroutine,如果有的话,除了本机和基于生成器的协同例程之间的语法之外,没有任何功能上的差异;为什么Python3两者都有?我理解什么是基于生成器的协同例程 是否有一个特定的设计决策或想法,使两者都有意义 还有,我在这里有点困惑;生成器和协同例程之间的区别在于我不能写入生成器;这增加了这样做的能力。我想在python中这两者没有区别吧?我还假设写入一个协例程和向一个协例程发送一个值是一样的 为什么asyncio支持两者的使用?在3.5之前,生成器和协同例程之间没有真正的区别。生成器是一个协同例程,它纯粹使用y

如果有的话,除了本机和基于生成器的协同例程之间的语法之外,没有任何功能上的差异;为什么Python3两者都有?我理解什么是基于生成器的协同例程

是否有一个特定的设计决策或想法,使两者都有意义

还有,我在这里有点困惑;生成器和协同例程之间的区别在于我不能写入生成器;这增加了这样做的能力。我想在python中这两者没有区别吧?我还假设写入一个协例程和向一个协例程发送一个值是一样的


为什么asyncio支持两者的使用?

在3.5之前,生成器和协同例程之间没有真正的区别。生成器是一个协同例程,它纯粹使用yield作为表达式,并通过send期望数据

随着Python3.5中添加了新版本,这种情况发生了变化。异步语法是一种语法糖,它将生成器在代码中可视化地转换为异步协同路由,并且是该语言的扩展,使协同路由可以用作上下文管理器,并支持异步和异步

引用政治公众人物的话:

建议在Python中使协同路由成为一个适当的独立概念,并引入新的支持语法。最终目标是帮助在Python中建立一个通用、易于接近的异步编程心智模型,并使其尽可能接近同步编程

在引擎盖下,co例程基本上仍然是生成器,生成器支持大部分相同的功能。Co例程现在是一种独特的类型,但是为了能够显式地测试可等待的对象,请参阅最初的动机,这是一个每个实例的标志,而不是一种独特的类型

为了清楚起见,您仍然可以使用。发送一个发电机。但发电厂并不在等待之中,预计不会合作


asyncio必须同时支持这两个版本,因为该库的目标是与Python版本<3.5兼容,因此不能依赖新的可用语言结构。

在3.5之前,生成器和协同例程之间没有真正的区别。生成器是一个协同例程,它纯粹使用yield作为表达式,并通过send期望数据

随着Python3.5中添加了新版本,这种情况发生了变化。异步语法是一种语法糖,它将生成器在代码中可视化地转换为异步协同路由,并且是该语言的扩展,使协同路由可以用作上下文管理器,并支持异步和异步

引用政治公众人物的话:

建议在Python中使协同路由成为一个适当的独立概念,并引入新的支持语法。最终目标是帮助在Python中建立一个通用、易于接近的异步编程心智模型,并使其尽可能接近同步编程

在引擎盖下,co例程基本上仍然是生成器,生成器支持大部分相同的功能。Co例程现在是一种独特的类型,但是为了能够显式地测试可等待的对象,请参阅最初的动机,这是一个每个实例的标志,而不是一种独特的类型

为了清楚起见,您仍然可以使用。发送一个发电机。但发电厂并不在等待之中,预计不会合作


asyncio必须同时支持这两个版本,因为该库的目标是与Python版本<3.5兼容,因此不能依赖可用的新语言结构。

公认的答案是一个很好的答案,并解释了该概念背后的一些演变。将数据发送到生成器(即您提到的PEP)的能力,有效地为首先发展到基于生成器的协同路由铺平了道路,然后演变成我们现在在Python中所知道的不同的协同路由。公认的答案是一个好的答案,并解释了该概念背后的一些演变。将数据发送到生成器(即您提到的PEP)的能力,有效地为首先发展到基于生成器的协同路由铺平了道路,然后演变为我们现在在Python中所知道的不同的协同路由。