为什么从本机协程产生有效语法

时间:2019-07-12 03:45:08

标签: python-3.x python-asyncio python-3.3

PEP-380引入了n_distinct语法,并说:

df %>%
  filter(dist <= 1100) %>%
  group_by(Year) %>%
  summarise(n = n_distinct(key))

其中是一个评估为可迭代的表达式,可从中提取迭代器。因此,以下是合法且有意义的:

  1. 发电者的收益
  2. generator_based_coroutine的产量(使用yield from装饰器)

因为生成器和基于生成器的协程都是Iterable的实例。但是,我不明白为什么

yield from <expr>

合法吗?由于PEP-492声明本地协程不实现@asyncio.coroutineyield from native_coroutines (using async/await syntax) 方法,因此是不可迭代的。但是,没有PEP谈论产量行为从接受原始协程返回的协程对象的变化吗?

我知道基于生成器的协程将在3.10中弃用,但我仍然想知道为什么__iter__与本地协程一起工作。

1 个答案:

答案 0 :(得分:1)

  

但是,我不明白为什么yield from native_coroutines(使用异步/等待语法)   是合法的吗?由于PEP-492指出本地协程不实现__iter____next__方法,因此是不可迭代的。

但是,PEP 492 also states表示“基于基于发电机的协程 [...]可以yield from个原生协程对象。”

  

但是,我不明白为什么yield from native_coroutines是合法的?

因为否则原本的协程就无法用于使用基于生成器的协程和yield from的旧代码。

例如,在引入async def之后的某个时刻,大多数异步原语,包括asyncio.sleep,都被转换为async def协程。如果那些不支持yield from,则转换将破坏使用asyncio.sleep的所有现有yield from等待的异步代码,这是以前唯一的等待方式。这种向后的不兼容性本来可以阻止引入天然协程,因此可以避免。