跳到内容

非增强赋值 (PLR6104)

源自 Pylint 代码检查工具。

修复总是可用的。

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

作用

检查可以被替换为增强赋值语句的赋值。

为什么这不好?

如果赋值语句的右侧包含一个二元运算,其中一个操作数与赋值目标相同,则可以将其重写为增强赋值。 例如,x = x + 1 可以重写为 x += 1

在执行此类操作时,增强赋值更简洁且符合习惯用法。

已知问题

在某些情况下,此规则不会检测到目标位于二元运算右侧的赋值(例如,x = y + x,而不是 x = x + y),因为对于某些数据类型(例如字符串),此类运算不可交换。

例如,x = "prefix-" + xx += "prefix-" 不等效,而 x = 1 + xx += 1 等效。

如果无法轻易推断左侧的类型,则该规则将忽略该赋值。

示例

x = x + 1

建议改为

x += 1

修复安全性

此规则的修复被标记为不安全,因为当目标是可变数据类型(如列表或字典)时,增强赋值具有不同的语义。

例如,考虑以下情况

foo = [1]
bar = foo
foo = foo + [2]
assert (foo, bar) == ([1, 2], [1])

如果赋值被替换为增强赋值,则更新操作将应用于 foobar,因为它们引用同一个对象

foo = [1]
bar = foo
foo += [2]
assert (foo, bar) == ([1, 2], [1, 2])