给出以下代码:
from typing import Self
from dataclasses import dataclass, field
@dataclass
class MyClass:
var: float = field(init=False)
def __post_init__(self: Self) -> None:
self.var = True
我的预期是,
self.var = True
行应该产生错误,因为错误的类型被分配给了self.var
。但是,像 mypy 或 Pyright 这样的类型检查器无法发现任何问题。是否可以以检测到错误分配的方式注释数据类?
这里有两件事很重要:
__post_init__
在对象初始化后运行,因此仅通过定义类不会出现任何运行时错误,但在通过 MyClass()
True
可以表示为浮点值 1.0
。强制进行所需检查的方法之一是由 Pydantic Dataclasses 和 Strict types 提供的。
简短示例:
from dataclasses import field
from pydantic.dataclasses import dataclass
from pydantic import StrictFloat
@dataclass
class MyClass:
var: StrictFloat = field(init=False)
def __post_init__(self) -> None:
self.var = True
调用
MyClass()
时,会出现错误:
my_class = MyClass()
输出:
ValidationError: 1 validation error for MyClass
var
value is not a valid float (type=type_error.float)