跳到内容

modified-iterating-set (PLE4703)

源自 Pylint 代码检查工具。

修复总是可用的。

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

作用

检查在迭代期间修改 set 的循环。

为什么这不好?

如果在迭代期间修改 set,将导致 RuntimeError

如果需要在循环中修改 set,请考虑迭代 set 的副本。

已知问题

此规则偏好于漏报而非误报。具体来说,它只会检测可以推断为基于本地类型推断的 set 类型的变量,并且只会检测直接对变量本身进行的修改(例如,set.add()),而不是在其他函数调用中进行的修改(例如,some_function(set))。

示例

nums = {1, 2, 3}
for num in nums:
    nums.add(num + 5)

建议改为

nums = {1, 2, 3}
for num in nums.copy():
    nums.add(num + 5)

修复安全性

此修复始终是不安全的,因为它会更改程序的行为。在迭代期间用副本替换原始集合允许以前会引发 RuntimeError 的代码在没有错误的情况下运行。

参考