mypy 没有意识到数据类的成员实际上是通过`__post_init__`

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

我有一个包含

dataclass
list[tuple[str,str]]
,我也希望能够使用
dict[str,str]
进行初始化。从编程上讲是这样的:

from dataclasses import dataclass

@dataclass
class Foobar:
    list_of_tuples: list[tuple[str, str]]

    def __post_init__(self):
        if isinstance(self.list_of_tuples, dict):
            self.list_of_tuples = list(self.list_of_tuples.items())


Foobar({"a": "b"})

但是mypy不高兴:

e.py:12: error: Argument 1 to "Foobar" has incompatible type "dict[str, str]"; expected "list[tuple[str, str]]"  [arg-type]

mypy 没有意识到我在初始化后直接将

dict
转换为
list[tuple]

不幸的是,数据类没有

__pre_init__
。如果可能的话,我也想避免覆盖
__init__()

有什么提示吗?

python mypy
1个回答
0
投票

如果您想使用

dict
列表初始化对象,请定义一个类方法来显式执行此操作。

from dataclasses import dataclass


@dataclass
class Foobar:
    list_of_tuples: list[tuple[str, str]]

    @classmethod
    def from_dict(cls, d: dict[str, str]):
        return cls(list_of_tuples=list(d.items()))



fb = Foobar.from_dict({"a": "b"})
© www.soinside.com 2019 - 2024. All rights reserved.