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

通过函数抛出异常实现类型收窄(Type narrowing)失效的原因及解决方案咨询

通过函数抛出异常实现类型收窄(Type narrowing)失效的原因及解决方案咨询

最近我碰到个类型检查的问题,实在搞不懂为啥通过抛出异常来排除变量类型的操作,没办法让类型检查器把变量的类型给收窄。

我本来想写这样的代码:

def ensure_int(obj: int | str) -> None:
    if isinstance(obj, str):
        raise ValueError("obj cannot be str")


def f(x: int | str) -> int:
    ensure_int(x)
    return x

我原以为在f函数里调用完ensure_int(x)之后,x的类型肯定会被收窄成int了,结果Mypy直接报错:

error: Incompatible return value type (got "Union[int, str]", expected "int")  [return-value]

但奇怪的是,如果我把ensure_int里的代码直接写到f函数里,这个错误就消失了。所以我有两个疑问:

  • 有没有什么场景下,调用ensure_int之后,x的类型不一定是int?
  • 有没有办法通过加注解之类的方式修复这个问题?我之前了解过TypeGuard和TypeIs,但这俩好像只支持返回bool的函数。

备注:内容来源于stack exchange,提问作者Stan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:13:43