跳到内容

mutable-class-default (RUF012)

作用

检查类属性中可变默认值的使用。

为什么这不好?

可变默认值在类的所有实例之间共享状态,但这并不明显。当在一个实例中更改属性时,可能会导致错误,因为这些更改会意外地影响所有其他实例。

一般来说,您可能希望完全避免在类主体中使用可变默认值;相反,这些变量通常应该在 __init__ 中初始化。但是,解决该问题的其他可能方法包括:

  • 使用 typing.ClassVar 显式注释变量,以表明它旨在在所有实例之间共享。
  • 使用不可变的数据类型(例如,元组而不是列表)作为默认值。

示例

class A:
    variable_1: list[int] = []
    variable_2: set[int] = set()
    variable_3: dict[str, int] = {}

建议改为

class A:
    def __init__(self) -> None:
        self.variable_1: list[int] = []
        self.variable_2: set[int] = set()
        self.variable_3: dict[str, int] = {}

或者

from typing import ClassVar


class A:
    variable_1: ClassVar[list[int]] = []
    variable_2: ClassVar[set[int]] = set()
    variable_3: ClassVar[dict[str, int]] = {}

或者

class A:
    variable_1: list[int] | None = None
    variable_2: set[int] | None = None
    variable_3: dict[str, int] | None = None

或者

from collections.abc import Sequence, Mapping, Set as AbstractSet
from types import MappingProxyType


class A:
    variable_1: Sequence[int] = ()
    variable_2: AbstractSet[int] = frozenset()
    variable_3: Mapping[str, int] = MappingProxyType({})