是否可以使用 dataclass 而不是 typeddict 来定义 dict 类型并使 mypy 满意?

Nat*_*tim 6 python mypy python-dataclasses python-typing typeddict

我有一个数据类,比方说:

from dataclasses import dataclass

@dataclass
class Foo:
    bar: int
    baz: int
Run Code Online (Sandbox Code Playgroud)

我有一个从接收 json 并将其作为字典加载的 API 调用的函数:

def handler(foo) -> Foo:
    return Foo(**foo)
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以输入 foo 而无需实际创建TypedDict数据类的镜像?

例如:

from typing_extensions import TypedDict


class SerializedFoo(TypedDict):
    bar: int
    baz: int
Run Code Online (Sandbox Code Playgroud)

我觉得必须定义两者很奇怪。

小智 -1

在下面的解决方案中,我找到了一种从另一个角度解决问题的方法,从TypedDictdataclass。我发现 TypedDict 的许多功能都被硬编码到类型检查器中,虽然它可能更有吸引力,但从数据类到 TypedDict 的转换似乎是不可能的。但是,如果我们从 TypedDict 开始,提取注释并使用它们来构造数据类,那么所有行为都会按其应有的方式进行。dataclass_transform在类型检查器的帮助下也很高兴:

from dataclasses import make_dataclass
from typing import TypedDict, cast, dataclass_transform

class Test(TypedDict):
    bar: int

@dataclass_transform()
def create_dataclass[T](name: str, cls: type[T]) -> type[T]:
    cls1 = make_dataclass(name, [(k,v) for k,v in cls.__annotations__.items()])
    return cast(type[T],cls1)

test: Test = {'bar': 1}

DataT = create_dataclass('DataT', Test)
print(DataT(
    bar=1
))
Run Code Online (Sandbox Code Playgroud)

注意:我在这里使用pyright而不是mypy,但我认为这将达到相同的结果