跳到内容

未排序的 __all__ (RUF022)

有时提供修复。

作用

检查未按照 "isort 风格" 排序的 __all__ 定义。

isort 风格的排序首先根据大小写对项目进行排序: SCREAMING_SNAKE_CASE 名称(通常用于全局常量)排在最前面,其次是 CamelCase 名称(通常用于类),最后是其他任何名称。 在每个类别中,使用自然排序对元素进行排序。

为什么这不好?

一致性很好。 使用通用的 __all__ 约定使您的代码更具可读性和惯用性。

示例

import sys

__all__ = [
    "b",
    "c",
    "a",
]

if sys.platform == "win32":
    __all__ += ["z", "y"]

建议改为

import sys

__all__ = [
    "a",
    "b",
    "c",
]

if sys.platform == "win32":
    __all__ += ["y", "z"]

修复安全性

如果 __all__ 定义中存在任何单独占据一整行的注释,则此规则的修复将被标记为不安全,例如

__all__ = [
    # eggy things
    "duck_eggs",
    "chicken_eggs",
    # hammy things
    "country_ham",
    "parma_ham",
]

这是一种用于分隔模块 API 中类别的常见模式,但尝试在按字母顺序排列 __all__ 的项目时维护这些类别超出了此规则的范围。

如果单行上有超过两个 __all__ 项,并且该行也有尾随注释,则该修复也会被标记为不安全,因为这里无法准确判断在排序 __all__ 时应将注释与哪个项目一起移动

__all__ = [
    "a", "c", "e",  # a comment
    "b", "d", "f",  # a second  comment
]

除此之外,该规则的修复被标记为始终安全,因为它很少会改变任何 Python 代码的语义。 但是,请注意(尽管很少见) __all__ 的值可能被其他地方的代码读取,这些代码依赖于 __all__ 中项目的确切迭代顺序,在这种情况下,此规则的修复理论上可能会导致中断。