跳到内容

unsorted-dunder-slots (RUF023)

有时提供修复。

作用

检查未按照自然排序排序的__slots__定义。

为什么这不好?

一致性是好事。为此特殊变量使用通用约定,以使你的代码更具可读性和符合习惯用法。

示例

class Dog:
    __slots__ = "name", "breed"

建议改为

class Dog:
    __slots__ = "breed", "name"

修复安全性

在三种情况下,此规则的修复被标记为不安全。

首先,如果__slots__定义中存在任何单独占据整行的注释,则修复是不安全的,例如

class Foo:
    __slots__ = [
        # eggy things
        "duck_eggs",
        "chicken_eggs",
        # hammy things
        "country_ham",
        "parma_ham",
    ]

这是一种常见的模式,用于分隔类槽中的类别,但是尝试在对__slots__的项目应用自然排序时维护这些类别将超出此规则的范围。

其次,如果单行上有两个以上的__slots__项,并且该行也有尾随注释,则该修复也被标记为不安全,因为在这里无法准确地衡量在排序__slots__时应将注释移动到哪个项目

class Bar:
    __slots__ = [
        "a", "c", "e",  # a comment
        "b", "d", "f",  # a second  comment
    ]

最后,每当 Ruff 检测到同一文件中其他地方的代码以某种方式读取__slots__变量,并且__slots__变量未分配给集合时,此规则的修复程序都会被标记为不安全。 这是因为如果正在迭代类的__slots__,或者正在分配给另一个值,则__slots__中项目的顺序可能具有语义意义。

在绝大多数其他情况下,此规则的修复不太可能导致中断。因此,Ruff 会将此规则的修复标记为安全。 但是,请注意(尽管很少见),__slots__的值仍然可以被__slots__定义所在的模块之外的代码读取,在这种情况下,此规则的修复在理论上可能会导致中断。