PEP-380引入了n_distinct
语法,并说:
df %>%
filter(dist <= 1100) %>%
group_by(Year) %>%
summarise(n = n_distinct(key))
其中是一个评估为可迭代的表达式,可从中提取迭代器。因此,以下是合法且有意义的:
yield from
装饰器)因为生成器和基于生成器的协程都是Iterable的实例。但是,我不明白为什么
yield from <expr>
合法吗?由于PEP-492声明本地协程不实现@asyncio.coroutine
和yield from native_coroutines (using async/await syntax)
方法,因此是不可迭代的。但是,没有PEP谈论产量行为从接受原始协程返回的协程对象的变化吗?
我知道基于生成器的协程将在3.10中弃用,但我仍然想知道为什么__iter__
与本地协程一起工作。
答案 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
等待的异步代码,这是以前唯一的等待方式。这种向后的不兼容性本来可以阻止引入天然协程,因此可以避免。