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
在下面的解决方案中,我找到了一种从另一个角度解决问题的方法,从TypedDict到dataclass。我发现 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,但我认为这将达到相同的结果
| 归档时间: |
|
| 查看次数: |
2415 次 |
| 最近记录: |