为何Pyright未检测到LineString赋值给int变量的类型错误?
如何让Pyright检测到显式类型标注与赋值的类型不匹配?
问题详情
明明给变量a显式标注了int类型,却把返回LineString类型的get_line_string()函数结果赋值给它,但Pyright完全没识别出这个类型不匹配,还允许把a当int来用。就算用了cast函数,或者自己给Shapely加了类型存根,还是触发不了错误提示。(注:这里以Shapely为例,本质是通用的类型检测问题)
代码示例
from typing import cast import shapely from shapely.geometry.linestring import LineString def get_line_string() -> LineString: return cast(LineString, shapely.from_wkt("LINESTRING (30 10, 10 30, 40 40)")) a: int = get_line_string() print(a + 1)
自定义类型存根示例
# 在 typings/shapely/__init__.pyi 文件中 def from_wkt(geometry: str) -> LineString: ...
解决办法
- 开启Pyright的严格类型检查
在pyrightconfig.json里设置"strict": true,或者单独启用"reportAssignmentTypeMismatch": true。默认情况下Pyright可能不会对这类赋值不匹配报错,开严格模式会强制检测这类问题。 - 别乱用
cast函数
代码里的cast(LineString, ...)会让类型检查器误以为返回值确实是LineString,如果shapely.from_wkt的实际返回类型和存根不符,就会出问题。要保证存根准确,别用cast掩盖真实类型。 - 确保自定义存根被Pyright识别
把typings目录加入Pyright的类型搜索路径,在pyrightconfig.json里设置"extraPaths": ["typings"],让Pyright优先加载你写的自定义存根。 - 用官方类型存根替代自定义的
试试安装Shapely的官方类型存根(比如pip install types-shapely),官方存根的定义更严谨,能帮Pyright正确识别函数返回类型。
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

