返回相同类型的函数类型提示不生效问题排查
问题:为什么
str -> str场景不被T -> T兼容? 以下代码在mypy检查时会报错,但从逻辑上看,str -> str似乎应该属于T -> T的范畴,问题出在哪?
from typing import TypeVar T = TypeVar("T") def unch(arg:T) -> T: if isinstance(arg, str): return arg return arg
mypy检查结果:
# error: Incompatible return value type (got "str", expected "T")
更新2:限定TypeVar后代码可正常通过检查
给TypeVar指定绑定类型后,代码就能通过mypy检查了:
from typing import TypeVar, Any T = TypeVar("T", str, Any) def unch(arg:T) -> T: if isinstance(arg, str): return arg return arg
原因解析
用无约束的TypeVar("T")时,mypy会把T当成任意具体类型。比如调用unch(123)时,T是int,函数必须返回int,但代码分支里返回了str,这就打破了「输入T返回T」的约定——mypy没法确定当arg是str时,T就一定是str,所以会报错。
而更新后的代码给TypeVar加了str和Any的绑定,T只能是这两种类型:
- 传入
str时,返回str完全符合T=T的要求; - 传入其他类型时,
T会被推断为Any,Any类型和任意类型都兼容,所以返回值不会触发类型错误。
内容的提问来源于stack exchange,提问作者VPfB
相关产品推荐
相关产品推荐

