给出以下代码块:
import typing as tp
T = tp.TypeVar("T")
def dummy(item: T) -> T:
return item
reveal_type(dummy)
当运行到它上面时,
pyright
打印:
❯ pyright type_arobase.py
< some output trimmed >
/home/gregoire.roussel/dev/wdc/python/type_arobase.py
/home/gregoire.roussel/dev/wdc/python/type_arobase.py:8:13 - information: Type of "dummy" is "(item: T@dummy) -> T@dummy"
0 errors, 0 warnings, 1 information
Completed in 0.617sec
注意输出中的
T@dummy
。
pyright
觉得需要为所有泛型类型添加后缀 @function_name
?(item: T) -> T
?注意:我在pyright文档中发现this paragraph在
self
和cls
的特殊情况下提到了这种现象,没有更多细节。
要回答这个问题,让我们看看以下案例:
from typing import TypeVar, Generic
T = TypeVar("T")
class Baz:
def __init__(self, a: T):
self.arg = a
def boo(self, a: T):
return self.arg
首先,
T
是一个全局变量,可以在脚本中以多种方式使用。 “@”用于区分它的使用位置。在某些情况下,尤其是在班级内部,区分是非常重要的。
Baz.boo
的签名是boo(a: [email protected]) -> T@Baz.__init__
返回类型,虽然是相同的变量,但不同,是在self.arg
期间固定为Baz.__init__
的类型。
虽然这是一个猜测,但与添加检查来比较位置是否确实相同然后删除位置部分相比,在内部跟踪并仅显示“@”会更容易。