mutable-class-default (RUF012)
作用
检查类属性中可变默认值的使用。
为什么这不好?
可变默认值在类的所有实例之间共享状态,但这并不明显。当在一个实例中更改属性时,可能会导致错误,因为这些更改会意外地影响所有其他实例。
一般来说,您可能希望完全避免在类主体中使用可变默认值;相反,这些变量通常应该在 __init__
中初始化。但是,解决该问题的其他可能方法包括:
- 使用
typing.ClassVar
显式注释变量,以表明它旨在在所有实例之间共享。 - 使用不可变的数据类型(例如,元组而不是列表)作为默认值。
示例
建议改为
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
或者