【发布时间】:2018-07-29 11:48:12
【问题描述】:
Python 3.7 文档 mentions 指出 yield 表达式“在用于实现理解和生成器表达式的隐式嵌套范围内”已被弃用,3.8 的删除待定:
由于它们对包含范围的副作用,yield 表达式不允许作为用于实现理解和生成器表达式的隐式定义范围的一部分(在 Python 3.7 中,此类表达式在编译时会发出 DeprecationWarning,在 Python 3.8+ 中它们会发出 SyntaxError)。
我试图了解此更改会影响什么(中断?),因为乍一看它解决了一个相当深奥的场景。首先在列表理解或生成器表达式中包含yield 是否有充分的理由?
到目前为止,我想出了这些(相当荒谬的)示例,它们在 Python 3.8 中应该是非法的:
>>> list((yield i) for i in range(5))
[0, None, 1, None, 2, None, 3, None, 4, None]
>>> list([(yield i) for i in range(5)])
[0, 1, 2, 3, 4]
【问题讨论】:
-
我猜这可能适用于基于生成器的协程,但您甚至无法在理解内分配以获取使用
send()发送的值,例如(a = (yield) for i in ...)。
标签: python list-comprehension yield python-3.7