字典值为函数时的类型标注问题:mypy提示‘object不可调用’如何解决?
解决方案
你需要用Callable类型替代object,明确标注字典中值的可调用签名,这样mypy就能识别这些是可执行的函数。
具体实现方式
根据generate函数的实际签名选择对应的标注方式:
- 基础通用标注
如果不确定generate的具体参数和返回值,可以用宽泛的Any定义:
from typing import Callable, Any Map: dict[str, Callable[[Any], Any]] = { "image": Image.generate, "video": Video.generate, }
- 精确签名标注
如果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, }
- 类型别名简化
如果多个函数签名一致,可用类型别名简化代码:
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
相关产品推荐
相关产品推荐

