You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:46:20