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
相关产品推荐
相关产品推荐

