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

字典值为函数时的类型标注问题:mypy提示‘object不可调用’如何解决?

解决方案

你需要用Callable类型替代object,明确标注字典中值的可调用签名,这样mypy就能识别这些是可执行的函数。

具体实现方式

根据generate函数的实际签名选择对应的标注方式:

  1. 基础通用标注
    如果不确定generate的具体参数和返回值,可以用宽泛的Any定义:
from typing import Callable, Any

Map: dict[str, Callable[[Any], Any]] = {
    "image": Image.generate,
    "video": Video.generate,
}
  1. 精确签名标注
    如果generate接收字典类型的json参数,返回对应类的实例,可以更精准地标注:
from typing import Callable, Union, Dict, Any

Map: dict[str, Callable[[Dict[str, Any]], Union[Image, Video]]] = {
    "image": Image.generate,
    "video": Video.generate,
}
  1. 类型别名简化
    如果多个函数签名一致,可用类型别名简化代码:
from typing import Callable, Dict, Any

# 定义匹配generate实际签名的类型别名
GenerateFunc = Callable[[Dict[str, Any]], object]

Map: dict[str, GenerateFunc] = {
    "image": Image.generate,
    "video": Video.generate,
}

为什么原来的object不行

object是Python所有类型的基类,但它不包含"可调用"的类型信息,mypy无法推断字典中的值是可执行的函数,因此会抛出"object not callable"错误。用Callable明确标注后,mypy就能识别这些值的可调用特性。

内容的提问来源于stack exchange,提问作者Khandaker Abrar Nadib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:35:22