调用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
相关产品推荐
相关产品推荐

