跳到内容

mutable-dataclass-default (RUF008)

作用

检查数据类属性中是否存在可变默认值。

为什么这不好?

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

与其共享可变默认值,不如使用 field(default_factory=...) 模式。

如果默认值旨在是可变的,则必须使用 typing.ClassVar 注释;否则,将引发 ValueError

示例

from dataclasses import dataclass


@dataclass
class A:
    # A list without a `default_factory` or `ClassVar` annotation
    # will raise a `ValueError`.
    mutable_default: list[int] = []

建议改为

from dataclasses import dataclass, field


@dataclass
class A:
    mutable_default: list[int] = field(default_factory=list)

或者

from dataclasses import dataclass
from typing import ClassVar


@dataclass
class A:
    mutable_default: ClassVar[list[int]] = []