`reveal_type` 输出中的星号是什么意思?

What does the asterisk in the output of `reveal_type` mean?

reveal_type(1) # Revealed type is 'builtins.int'
bla = [1,2,3]
reveal_type(bla[0]) # Revealed type is 'builtins.int*'
reveal_type(bla[0] * 2) # Revealed type is 'builtins.int'

intint*有什么区别?

这意味着特定类型被 mypy 推断为执行类型变量替换的一部分。

例如,blah[0]实际上是在做blah.__getitem__(0):原来__getitem__方法被定义为return类型_T的某个值,其中 _T 是列表中包含的任何类型*。

Mypy 理解 blah 包含整数,因此推断 _T return 类型是 int.

类型

相比之下,只有 1blah[0] * 2 没有类型变量推断。前者是字面意思;后者正在调用 int.__mul__(...) 方法,该方法被输入为 return,特别是一个 int.

*好吧,这实际上不是准确的签名,但足够接近了。


在大多数情况下,您可以忽略这一点并将其视为 mypy 的实现细节。它的存在主要是因为在修补或调试 mypy 内部结构时,能够判断一个类型是否被推断有时很有用。