跳到内容

yield-in-for-loop (UP028)

源自 pyupgrade linter。

有时提供修复。

作用

检查可以被 yield from 表达式替换的 for 循环。

为什么这不好?

如果一个 for 循环只包含一个 yield 语句,那么它可以被更简洁和地道的 yield from 表达式替换。

示例

def bar():
    for x in foo:
        yield x

    global y
    for y in foo:
        yield y

建议改为

def bar():
    yield from foo

    for _element in foo:
        y = _element
        yield y

修复安全性

此规则的修复被标记为不安全,因为将 for 循环转换为 yield from 表达式可能会在极少数情况下改变程序的行为。例如,如果一个生成器正在通过 send 发送值,那么重写为 yield from 可能会导致属性错误,如果底层生成器没有实现 send 方法。

此外,如果至少有一个目标是 globalnonlocal,则不会提供修复。

但是在大多数情况下,这个修复是安全的,这样的修改应该不会对程序的行为产生影响。

参考