使用Protocol与dataclass时遭遇mypy报错求助
问题原因及细节解析
旧版mypy(0.942)的Protocol支持缺陷
早期mypy对PEP 544定义的Protocol类型系统支持不完善,尤其是处理Type[...](类类型注解)时,会错误地要求必须传入具体类(非抽象类、非Protocol类)。它不认可Protocol作为类级别的抽象约束,把Type[Protocol类型]这种写法判定为非法,认为只有实实在在的具体类才能满足Type[...]的预期类型。mypy 1.2.0的修复逻辑
后续版本的mypy(包括1.2.0)跟进完善了Protocol的类类型支持,严格遵循PEP 544规范:允许将Protocol作为Type[...]的类型参数,用来约束那些实现了Protocol所有成员的类本身(而非类的实例)。类型检查器修正了之前的判断逻辑,能够正确识别Protocol作为类级抽象契约的合法性,只要传入的类满足Protocol定义的结构,就会被判定为符合Type[Protocol类型]的要求。对应代码场景的验证
举个典型的代码例子,如果你写了这样的代码:from typing import Protocol, Type class ServiceProtocol(Protocol): name: str def run(self) -> None: ... def start_service(service_cls: Type[ServiceProtocol]) -> ServiceProtocol: return service_cls()在mypy 0.942中,
Type[ServiceProtocol]这行会触发你遇到的错误;升级到1.2.0后,mypy会正确识别:只要传入的类(比如class MyService: name = "test"; def run(self): ...)符合ServiceProtocol的结构,就不会报错。
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

