2

Python 3.7 文档提到“在用于实现理解和生成器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]
4

1 回答 1

5

yield 在推导式或生成器表达式中的应用是什么?

没有什么。

这个“特性”被确认是一个错误,并且正在为 python3.7 弃用,并将在 python3.8 中完全删除,导致一个SyntaxErrorif used。

文档中,

Yield 表达式(yieldyield from子句)现在在理解和生成器表达式中被弃用(除了最左边的 for 子句中的可迭代表达式)。这确保了理解总是立即返回适当类型的容器(而不是可能返回生成器迭代器对象),而生成器表达式不会尝试将其隐式输出与任何显式 yield 表达式的输出交错。

在 Python 3.7 中,此类表达式DeprecationWarning在编译时会发出,在 Python 3.8+ 中,它们会发出SyntaxError. (由 Serhiy Storchaka 在 bpo-10544 中贡献。)

于 2018-02-19T09:24:03.843 回答