跳到内容

dataclass默认参数中的函数调用 (RUF009)

作用

检查 dataclass 属性默认值中的函数调用。

为什么这不好?

函数调用只在定义时执行一次。 返回的值随后会被 dataclass 的所有实例重用。 当函数调用返回一个可变对象时,这可能会导致意外的行为,因为对该对象的更改将在所有实例之间共享。

如果一个字段需要用一个可变对象初始化,使用 field(default_factory=...) 模式。

默认参数为 NewType 调用,且原始类型为不可变类型的属性将被忽略。

示例

from dataclasses import dataclass


def simple_list() -> list[int]:
    return [1, 2, 3, 4]


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

建议改为

from dataclasses import dataclass, field


def creating_list() -> list[int]:
    return [1, 2, 3, 4]


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

Options (选项)