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

如何为元类的__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()

关键改动说明

  1. 将__prepare__的返回类型从Mapping[str, Any]改为Mapping[str, object],完全匹配父类type的方法签名。
  2. 给metcls参数添加了type[type]的注解(可选,但能提升类型检查的准确性)。

_dummy_dict继承自dict[str, Any],而dict[str, Any]天然兼容Mapping[str, object](因为Any覆盖了所有object的子类型),因此MyPy会认可这个返回类型。

关于编辑器与命令行报错的差异

type的__prepare__本身就是被@classmethod装饰的方法,编辑器插件的报错更完整地展示了父类的方法定义细节,而命令行的MyPy输出只是省略了装饰器的标注,但两者指向的核心问题是一致的。

内容的提问来源于stack exchange,提问作者schuelermine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:55:29