跳到内容

assignment-in-assert (RUF018)

添加于 v0.2.0 · 相关问题 · 查看源码

作用

检查 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

参考