跳到内容

unnecessary-enumerate (FURB148)

派生自 refurb 代码检查工具。

有时提供修复。

此规则不稳定且处于预览状态。使用需要 --preview 标志。

作用

检查 enumerate 的使用,当迭代序列时,丢弃了索引或值。

为什么这不好?

内置函数 enumerate 在您需要序列的索引和值时非常有用。

如果您只需要序列的索引或值,则应分别迭代 range(len(...)) 或序列本身。 这样做更有效,并且更清晰地表达了代码的意图。

已知问题

由于类型推断的限制,此规则容易产生误报; 也就是说,只有当传递给 enumerate 的序列被实例化为列表、集合、字典或元组字面量,或使用类型注释进行注释时,它才会建议使用 len 内置函数进行修复。

len 内置函数并非为所有对象类型(例如生成器)定义,因此重构为使用 len 代替 enumerate 并不总是安全的。

示例

for index, _ in enumerate(sequence):
    print(index)

for _, value in enumerate(sequence):
    print(value)

建议改为

for index in range(len(sequence)):
    print(index)

for value in sequence:
    print(value)

参考