如何正确注释具有未初始化属性的数据类?

问题描述 投票:0回答:1

给出以下代码:

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 这样的类型检查器无法发现任何问题。是否可以以检测到错误分配的方式注释数据类?

python python-typing mypy
1个回答
1
投票

这里有两件事很重要:

  • first:
    __post_init__
    在对象初始化后运行,因此仅通过定义类不会出现任何运行时错误,但在通过
    MyClass()
  • 初始化对象之后
  • 第二:这是Python中的强制转换问题 - 如果您传递“兼容类型”的数据,即使它与请求的类型不完全匹配,它也会被接受为可能的值。在这种情况下,值
    True
    可以表示为浮点值
    1.0

强制进行所需检查的方法之一是由 Pydantic DataclassesStrict 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)
© www.soinside.com 2019 - 2024. All rights reserved.