跳到内容

冗余布尔字面量 (redundant-bool-literal) (RUF038)

预览(自 0.8.0 版本起) · 相关议题 · 查看源码

有时提供修复。

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

作用

检查 Literal[True, False] 类型注解。

为什么这不好?

在类型注解中,Literal[True, False] 可以替换为 bool,二者语义相同,但 bool 更简洁且易于阅读。

bool 类型恰好有两个常量实例:TrueFalse。静态类型检查器(如 mypy)在类型注解中会将 Literal[True, False] 视为与 bool 等价。

示例

from typing import Literal

x: Literal[True, False]
y: Literal[True, False, "hello", "world"]

建议改为

from typing import Literal

x: bool
y: Literal["hello", "world"] | bool

修复安全性

此规则的修复程序被标记为“不安全”,因为它可能会改变代码语义。具体来说:

  • 当通过 Literal[True]Literal[False] 重载布尔参数时,类型检查器可能不会将 bool 视为等价(参见 #14764#5421)。
  • bool 并非严格等同于 Literal[True, False],因为 boolint 的子类;如果类型注解用于数值上下文,则此规则可能不适用。

此外,Literal 片段中可能包含行尾注释,修复程序会将其移除。

参考