跳到内容

post-init-default (RUF033)

有时提供修复。

作用

检查 __post_init__ 数据类方法中带有参数默认值的情况。

为什么这不好?

__post_init__ 方法中为参数添加默认值不会影响该参数在数据类生成的 __init__ 方法中是否具有默认值。要创建一个只用于初始化的数据类参数并带有默认值,你应该在数据类的类主体中使用 InitVar 字段,并为该 InitVar 字段提供一个默认值。

正如文档所述

仅初始化字段作为参数添加到生成的 __init__() 方法中,并传递给可选的 __post_init__() 方法。它们不会被数据类以其他方式使用。

示例

from dataclasses import InitVar, dataclass


@dataclass
class Foo:
    bar: InitVar[int] = 0

    def __post_init__(self, bar: int = 1, baz: int = 2) -> None:
        print(bar, baz)


foo = Foo()  # Prints '0 2'.

建议改为

from dataclasses import InitVar, dataclass


@dataclass
class Foo:
    bar: InitVar[int] = 1
    baz: InitVar[int] = 2

    def __post_init__(self, bar: int, baz: int) -> None:
        print(bar, baz)


foo = Foo()  # Prints '1 2'.

修复安全性

此修复总是被标记为不安全,因为虽然切换到 InitVar 通常是正确的,但当参数不打算成为公共 API 的一部分时,或者当该值打算在所有实例之间共享时,这是不正确的。

参考