如何在dataclass中为**kwargs添加类型提示?
为dataclass的
__new__方法的**kwargs添加类型提示 你需要给dataclass类Foo的__new__方法的**kwargs添加类型提示,但直接在方法内使用Unpack[Foo]会因为类未完全定义而报错,这里提供几种可行的解决方案:
方案1:使用字符串形式的前向引用
利用字符串形式的类名作为Unpack的参数,绕开类未定义的问题,大部分现代类型检查器(如pyright、mypy)都支持这种写法:
from dataclasses import dataclass from typing import Optional from typing_extensions import Unpack @dataclass class Foo: var1: int var2: float var3: bool var4: str var5: Optional[list[float]] def __new__(cls, **kwargs: Unpack["Foo"]) -> "Foo": return super(Foo, cls).__new__(cls)
方案2:使用TypedDict定义参数结构
先创建一个与Foo字段完全匹配的TypedDict类型,再通过Unpack该类型来标注kwargs,这种方式兼容性更强,适合对类型检查器支持度要求较高的场景:
from dataclasses import dataclass from typing import Optional, TypedDict from typing_extensions import Unpack class FooParams(TypedDict): var1: int var2: float var3: bool var4: str var5: Optional[list[float]] @dataclass class Foo: var1: int var2: float var3: bool var4: str var5: Optional[list[float]] def __new__(cls, **kwargs: Unpack[FooParams]) -> "Foo": return super(Foo, cls).__new__(cls)
方案3:Python 3.11+ 结合Self类型
如果你的项目基于Python 3.11及以上版本,可以用typing.Self替代字符串形式的返回类型提示,参数部分依然使用前向引用的Unpack写法:
from dataclasses import dataclass from typing import Optional, Self from typing_extensions import Unpack @dataclass class Foo: var1: int var2: float var3: bool var4: str var5: Optional[list[float]] def __new__(cls, **kwargs: Unpack["Foo"]) -> Self: return super(Foo, cls).__new__(cls)
内容的提问来源于stack exchange,提问作者wordhydrogen
相关产品推荐
相关产品推荐

