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

typing.Literal正确用法:为何mypy校验动态返回值会报错?

typing.Literal类型校验问题核心知识点

你遗漏的是两个关于静态类型检查和Literal使用的规则:

  • 静态类型检查器默认不会推导动态计算值的字面量类型
    你的入参word注解是通用str类型,mypy只会认为它可以是任意字符串,因此'Hello ' + word的推导结果为通用str类型,和你声明的返回值Literal['Hello XY']不匹配,所以触发类型错误。
  • Literal类型要求返回值是静态可确定的字面量
    只有直接写在代码中的固定字面量(比如你修改后版本直接return 'Hello XY'),mypy才会直接识别为对应的Literal类型。动态计算得到的值除非整条推导链路都是Literal类型,否则都会被判定为通用类型。

可行改造方案

方案1:限定入参为Literal类型

如果该函数的入参只能是固定值,可以直接限定入参的Literal类型,此时mypy可以正确推导出拼接后的字符串字面量类型:

from typing import Literal

def verify(word: Literal['XY']) -> Literal['Hello XY']:
    a = 'Hello ' + word
    return a

a = verify('XY') # mypy校验完全通过

方案2:用cast强制类型声明

如果你确实需要入参为通用str,且可以100%保证运行时返回值一定符合Literal要求,可以用typing.cast强制指定类型,相当于你自行对类型正确性兜底:

from typing import Literal, cast

def verify(word: str) -> Literal['Hello XY']:
    a = 'Hello ' + word
    return cast(Literal['Hello XY'], a)

内容的提问来源于stack exchange,提问作者archit jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:09:04