为什么pyright用`T@function_name`描述泛型参数?

问题描述 投票:0回答:1

给出以下代码块:

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
的特殊情况下提到了这种现象,没有更多细节。

python pyright
1个回答
0
投票

要回答这个问题,让我们看看以下案例:

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__
的类型。

虽然这是一个猜测,但与添加检查来比较位置是否确实相同然后删除位置部分相比,在内部跟踪并仅显示“@”会更容易。

© www.soinside.com 2019 - 2024. All rights reserved.