Pyright为何用`T@function_name`描述泛型参数?
Pyright泛型类型后缀
@function_name的疑问与解答 示例代码
import typing as tp T = tp.TypeVar("T") def dummy(item: T) -> T: return item reveal_type(dummy)
Pyright运行输出
> pyright myfile.py [...] information: Type of "dummy" is "(item: T@dummy) -> T@dummy" 0 errors, 0 warnings, 1 information
问题
- Pyright为何需要给所有泛型类型添加
@function_name后缀? - 相比原签名
(item: T) -> T,该格式能带来哪些额外信息?
解答
添加
@function_name后缀的原因
这是为了区分不同作用域下的同名类型变量。比如当你定义多个使用T作为TypeVar的函数,或者在函数内部嵌套了另一个带同名TypeVar的泛型函数时,这个后缀能让Pyright明确每个T的归属函数,避免类型分析过程中出现混淆。相比原签名的额外信息
原签名里的T只是一个泛型占位符,加上@dummy后缀后能提供更明确的上下文信息:
- 标记作用域归属:能直接看出这个
T是dummy函数专属的类型变量,它的约束和类型绑定仅在dummy函数的上下文里生效,和其他地方的同名T没有关联。 - 提升类型诊断清晰度:当代码中存在多个泛型函数时,Pyright的提示或报错信息带这个后缀,能让你快速定位到是哪个函数的泛型参数出现问题,不用在一堆同名
T里猜测。
内容的提问来源于stack exchange,提问作者Grégory Roussel
相关产品推荐
相关产品推荐

