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

调用typeshed的isinstance后Mypy未报错是否为预期行为?

为什么Mypy在有assert isinstance时不触发类型错误?

这是Mypy的预期行为,核心原因是它的「类型窄化(Type Narrowing)」特性,下面具体拆解:

  • 类型窄化的作用:Mypy会识别assert isinstance(...)这类断言语句,将变量的类型推断范围缩小到断言指定的类型。在你的代码里,虽然set_kv函数的value参数标注的是int,但在assert isinstance(value, six.string_types)之后,Mypy会认为后续代码中value的类型一定是字符串(因为如果断言不成立,代码会直接抛出异常,不会执行到赋值逻辑)。既然value被推断为字符串,赋值给self.__store(类型为t.Dict[str, str])就完全符合类型要求,自然不会报错。

  • 去掉断言后报错的原因:当你移除这个assert语句时,Mypy就没有了类型窄化的依据,它会严格按照函数参数的标注来判断——value是int类型,和self.__store要求的str类型不匹配,所以触发类型错误。

这里还要补充一个细节:你的代码其实存在运行时逻辑矛盾(参数标注是int,却断言它是字符串),但Mypy是静态类型检查工具,它不会验证你断言的逻辑合理性,只会根据断言来调整对变量的类型推断。如果你的实际意图是让value接受字符串,应该直接修改函数参数的类型标注为str,而不是用断言来“欺骗”类型检查器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:19