为何别名化dataclass(frozen=True)会触发mypy检查失败?
为frozen dataclass创建装饰器别名的问题解决
直接给dataclasses.dataclass(frozen=True)赋值别名会导致mypy无法正确识别类的初始化参数,核心原因是mypy没法追踪别名装饰器的完整类型信息,丢失了dataclass装饰器的泛型推导能力。
下面是两种可行的解决方式:
方式一:显式标注别名的类型
通过TypeVar和Callable给别名添加精确的类型标注,让mypy能正确识别装饰器的作用:
import dataclasses from typing import TypeVar, Callable, Type T = TypeVar('T') # 明确标注别名是能接收类并返回类的可调用对象 key: Callable[[Type[T]], Type[T]] = dataclasses.dataclass(frozen=True) @key class A: a: str A(a="a") # mypy不再报错
方式二:用函数封装装饰器
把dataclass(frozen=True)包装成一个函数,mypy能正确解析这种形式的装饰器:
import dataclasses from typing import TypeVar, Type T = TypeVar('T') def key(cls: Type[T]) -> Type[T]: return dataclasses.dataclass(frozen=True)(cls) @key class A: a: str A(a="a") # mypy不再报错
如果不需要严格的类型标注,也可以简化成无标注的函数:
import dataclasses def key(cls): return dataclasses.dataclass(frozen=True)(cls) @key class A: a: str A(a="a")
内容的提问来源于stack exchange,提问作者psarka
相关产品推荐
相关产品推荐

