gpt4 book ai didi

python - Dataclasses 和 TypedDicts 之间的类型检查转换

转载 作者:行者123 更新时间:2023-12-04 11:35:31 24 4
gpt4 key购买 nike

我有一堆@dataclass es 和一堆对应的 TypedDict s,我想促进它们之间的平滑和类型检查转换。
例如,考虑

from dataclasses import dataclass
from typing_extensions import TypedDict

@dataclass
class Foo:
bar: int
baz: int

@property
def qux(self) -> int:
return self.bar + self.baz

class SerializedFoo(TypedDict):
bar: int
baz: int
qux: int
要创建序列化函数,我可以编写类似
def serialize(foo: Foo) -> SerializedFoo:
return SerializedFoo(
bar=foo.bar,
baz=foo.baz,
qux=foo.qux,
)
但是对于很多类型这样做变得乏味,而且每次更新类型时,我还必须更新序列化功能。
我也可以做类似的事情
import dataclasses

def serialize(foo: Foo) -> SerializedFoo:
return SerializedFoo(**dataclasses.asdict(foo))
但这不会进行类型检查; mypy提示它 Expected keyword arguments, {...}, or dict(...) in TypedDict constructor .
从理论上讲,足够聪明的类型检查器应该有可能知道数据类具有初始化类型字典所需的属性,当然还有 asdict 的用法。这在实践中是不可能的。
有没有更好的方法来转换 dataclassTypedDict带有相应的字段,这让我都可以让类型检查器在出现问题时告诉我,而不必在转换中输入每个字段?

最佳答案

可能使其类型检查的一种方法是使用 cast .

from typing import cast
def serialize(foo: Foo) -> SerializedFoo:
return SerializedFoo(**cast(SerializedFoo, dataclasses.asdict(foo)))
也许结帐英安。对于这样的东西,它有一些漂亮的东西,而没有棉花糖的过度杀伤力。它允许在其 asdict/from_dict 函数中进行某种类型转换。
https://pypi.org/project/dacite/
编辑:正如@AlexWaygood 评论的那样,TypedDict 是运行时的常规字典,而不是真正的类,不进行任何类型检查,仅用于类型提示目的。所以代码可以简化为
from typing import cast
def serialize(foo: Foo) -> SerializedFoo:
return cast(SerializedFoo, dataclasses.asdict(foo))
这将使 python 类型检查器高兴。我不直接使用 mypy,所以不能直接为它说话。

关于python - Dataclasses 和 TypedDicts 之间的类型检查转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66985483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com