如何为元类的__prepare__方法添加正确的类型注解?
解决元类
__prepare__方法的MyPy类型注解兼容问题 你遇到的核心问题是子类dummy的__prepare__方法签名与父类type不兼容,具体是返回类型的校验不通过:父类要求返回Mapping[str, object],而你标注的Mapping[str, Any]在MyPy的严格模式下不被视为合法的子类型。
修正后的代码
from dataclasses import dataclass from typing import Any, Mapping, Tuple, type @dataclass class DummyCall: args: tuple[Any, ...] kwargs: dict[str, Any] def _dummy_function(*args: Any, **kwargs: Any) -> DummyCall: return DummyCall(args, kwargs) class _dummy_dict(dict[str, Any]): def __setitem__(self, key: str, value: Any) -> None: if callable(value): super().__setitem__(key, _dummy_function) else: super().__setitem__(key, value) class dummy(type): @classmethod def __prepare__( metcls: type[type], name: str, bases: Tuple[type, ...], **kwds: Any ) -> Mapping[str, object]: return _dummy_dict()
关键改动说明
- 将
__prepare__的返回类型从Mapping[str, Any]改为Mapping[str, object],完全匹配父类type的方法签名。 - 给
metcls参数添加了type[type]的注解(可选,但能提升类型检查的准确性)。
_dummy_dict继承自dict[str, Any],而dict[str, Any]天然兼容Mapping[str, object](因为Any覆盖了所有object的子类型),因此MyPy会认可这个返回类型。
关于编辑器与命令行报错的差异
type的__prepare__本身就是被@classmethod装饰的方法,编辑器插件的报错更完整地展示了父类的方法定义细节,而命令行的MyPy输出只是省略了装饰器的标注,但两者指向的核心问题是一致的。
内容的提问来源于stack exchange,提问作者schuelermine
相关产品推荐
相关产品推荐

