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 的一部分时,或者当该值打算在所有实例之间共享时,这是不正确的。