跳到内容

unnecessary-nested-literal (RUF041)

有时提供修复。

作用

检查不必要的嵌套 Literal

为什么这不好?

最好使用单个 Literal,它既等效又更简洁。

作为 [PEP 586] 中提出的符合人体工程学的功能,支持通过其他字面量参数化字面量,以实现诸如以下模式:

ReadOnlyMode         = Literal["r", "r+"]
WriteAndTruncateMode = Literal["w", "w+", "wt", "w+t"]
WriteNoTruncateMode  = Literal["r+", "r+t"]
AppendMode           = Literal["a", "a+", "at", "a+t"]

AllModes = Literal[ReadOnlyMode, WriteAndTruncateMode,
                  WriteNoTruncateMode, AppendMode]

因此,类型检查器也支持字面量的嵌套,这不如扁平化的 Literal 可读性好

AllModes = Literal[Literal["r", "r+"], Literal["w", "w+", "wt", "w+t"],
                  Literal["r+", "r+t"], Literal["a", "a+", "at", "a+t"]]

示例

AllModes = Literal[
    Literal["r", "r+"],
    Literal["w", "w+", "wt", "w+t"],
    Literal["r+", "r+t"],
    Literal["a", "a+", "at", "a+t"],
]

建议改为

AllModes = Literal[
    "r", "r+", "w", "w+", "wt", "w+t", "r+", "r+t", "a", "a+", "at", "a+t"
]

或者像第一个示例中那样将字面量赋值给变量。

修复安全性

Literal 切片跨越多行且某些行有尾部注释时,此规则的修复被标记为不安全。

参考

PEP 586