为何MyPy在isinstance校验后仍不识别x[idx]为bool类型?
MyPy类型验证问题:字典索引返回值无法被识别为布尔类型
核心问题
MyPy无法将返回值x[idx]识别并验证为布尔类型,以下代码会触发类型检查错误:
if isinstance(x[idx], bool) is True: return x[idx]
完整示例代码
from typing import Union, Optional x: dict[str, Union[bool, str]] = {'a': True, 'b': 'foo'} def return_if_bool(idx: str) -> Optional[bool]: if isinstance(x[idx], bool): return x[idx] return None print(return_if_bool('a'))
MyPy报错信息
8: error: Incompatible return value type (got "bool | str", expected "bool | None") [return-value]
解决方案
- 使用
typing.cast强制类型转换,可解决该问题:
return typing.cast(bool, x[idx])
- @Wombatz提出了一种更简洁的方案(无需使用cast):将
x[idx]赋值给一个变量,再进行类型判断和返回:
y: Union[bool, str] = x[idx] if isinstance(y, bool): return y
疑问
我原本以为这种简单场景不需要借助typing.cast()或者赋值变量就能正常通过类型检查,但始终搞不懂背后的原因。
可能的解释
@Wombatz指出,MyPy无法确定多次访问x[idx]会返回相同的值——这一解释已经接近问题本质。不过MyPy似乎能识别迭代器这类对象的行为,所以这点还是让人觉得奇怪。
内容的提问来源于stack exchange,提问作者Patrick C
相关产品推荐
相关产品推荐

