跳到内容

redundant-bool-literal (RUF038)

有时提供修复。

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

作用

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

为什么这不好?

Literal[True, False] 可以在类型注解中被替换为 bool,它们具有相同的语义含义,但 bool 更简洁易读。

bool 类型只有两个常量实例:TrueFalse。 静态类型检查器例如 mypyLiteral[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 切片可能包含尾行注释,修复会删除这些注释。

参考