Python类型提示:如何处理可选返回值的mypy校验问题
解决mypy类型窄化不生效的问题
针对你遇到的mypy无法识别if url != None:代码块内url非None类型的问题,有以下几种可行方案:
方案1:用is not None替代!= None
mypy对身份运算符is not None的类型窄化支持更稳定,因为!=可能被自定义重载,导致类型推断失效。修改判断语句后,mypy能正确识别分支内url的类型为str:
def _get_user_image(self) -> tuple[str, str]: local_filepath = "some/path" cloudpath = "https://some.url" url = check_file_exists(cloudpath) if url is not None: return url, local_filepath # 必须补充所有路径的返回/抛出逻辑,否则mypy会报"Missing return statement"错误 raise ValueError("云存储中未找到目标文件")
方案2:使用assert语句明确类型
通过assert断言url不为None,mypy会将断言后的url类型窄化为str,同时还能在运行时做校验:
def _get_user_image(self) -> tuple[str, str]: local_filepath = "some/path" cloudpath = "https://some.url" url = check_file_exists(cloudpath) assert url is not None, "云存储中未找到目标文件" return url, local_filepath
方案3:使用typing.cast强制类型转换
如果确定该分支内url一定不为None,可以用cast直接告诉mypyurl的类型,这种方式不会影响运行时逻辑,仅做类型提示:
from typing import cast def _get_user_image(self) -> tuple[str, str]: local_filepath = "some/path" cloudpath = "https://some.url" url = check_file_exists(cloudpath) if url != None: return cast(str, url), local_filepath raise ValueError("云存储中未找到目标文件")
内容的提问来源于stack exchange,提问作者dcsan
相关产品推荐
相关产品推荐

