跳到内容

assignment-in-assert (RUF018)

作用

检查 assert 语句中命名的赋值表达式(例如,x := 0)。

为什么这不好?

命名的赋值表达式(也称为“海象运算符”)用于在更大的表达式中将值赋给变量。

命名的赋值在 assert 语句中是语法上有效的。但是,当 Python 解释器在 -O 标志下运行时,assert 语句不会被执行。在这种情况下,命名的赋值也会被忽略,这可能会导致意外的行为(例如,未定义的变量访问)。

示例

assert (x := 0) == 0
print(x)

建议改为

x = 0
assert x == 0
print(x)

该规则避免标记那些仅从 assert 语句内部引用的变量的命名表达式;以下情况不会触发该规则

assert (x := y**2) > 42, f"Expected >42 but got {x}"

这个也不会触发

assert (x := y**2) > 42
assert x < 1_000_000

参考