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

为何泛型协议中f()返回类型被识别为Unknown/Any而非T@MyProto?

问题原因解析

核心问题:未绑定泛型协议的类型推断限制

你定义的tup类型是t.Tuple[MyProto, ...],这里的MyProto是未指定类型参数的泛型协议(即未绑定泛型)。类型检查器无法确定元组中每个MyProto实例对应的具体T类型——因为元组里可以同时存在MyProto[int]、MyProto[str]等不同类型参数的实例,此时调用item.f()的返回值类型无法被明确推断,只能 fallback 到Any(mypy)或Unknown(Pylance),而不是T@MyProto。

为什么item.g(fout)能正常通过检查?

虽然fout被推断为Any/Unknown,但类型检查器会针对泛型协议做存在性兼容校验:只要传入的fout类型与当前item的T类型兼容即可。而Any/Unknown作为顶级类型,能与任意类型兼容,所以item.g(fout)不会触发类型错误。

如何让类型检查器推断出T@MyProto?

如果元组中所有MyProto实例的类型参数T是统一的,只需明确指定元组的泛型类型:

# 比如统一为int类型
tup: t.Tuple[MyProto[int], ...] = tuple()

此时item.f()的返回值就会被准确推断为int(对应T@MyProto)。

内容的提问来源于stack exchange,提问作者moon prism power

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:45:00