Pylance 无法将 list[int] 识别为类型注释

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

我想使用内置类型注释

list[int]
而不是
typing.List[int]
,但 Pylance 无法将 list[int] 识别为有效的类型表达式。奇怪的是,当我为函数参数变量进行类型注释时没有问题。我怎样才能让 Pylance 理解
list[int]
是一个有效的类型注释?

皮兰斯错误:

Variable not allowed in type expression Pylance (reportInvalidTypeForm)

终端错误:

PS C:\Users\user\Programming\Python\pythonED> & "C:/Program Files/Python313/python.exe" "c:/Users/user/Programming/Python/pythonED/exercise14.py"
Traceback (most recent call last):
  File "c:\Users\user\Programming\Python\pythonED\exercise14.py", line 8, in <module>
    list: list[int] =  [1, 3, 5, 3, 5, 6, 8, 4, 23, 7, 8, 5, 7, 5, 7, 9, 9, 5, 4, 7, 5]
          ~~~~^^^^^
TypeError: list indices must be integers or slices, not type

这是我的代码:

def loop_list(b_list: list[int]) -> list[int]:
    list = []
    for i in b_list:
        if i not in list:
            list.append(i)
    return list

list: list[int] =  [1, 3, 5, 3, 5, 6, 8, 4, 23, 7, 8, 5, 7, 5, 7, 9, 9, 5, 4, 7, 5]
print(loop_list(list))

我发现使用的唯一解决方案是打字模块的列表功能。但经过一番阅读后,由于较新版本的 Python 中内置类型注释,打字模块似乎已经过时了。所以,我宁愿使用内置功能而不是模块。

python python-3.x python-typing
1个回答
0
投票

发生这种情况是因为您有一个名为

list
的变量,它隐藏了内置类型。要解决此问题,只需为变量指定一个不同的名称即可:

nums: list[int] =  [1, 3, 5, 3, 5, 6, 8, 4, 23, 7, 8, 5, 7, 5, 7, 9, 9, 5, 4, 7, 5]

这通常是一个很好的实践,因为您应该尽可能避免隐藏内置函数。

Pylance 不喜欢您当前的代码,因为

list
是一个变量,如果它允许您使用变量进行类型注释,那么它就不再是“静态”类型检查器了。 Python 不喜欢你的代码,因为如果
list
是 Python 内置
list
类的实例,则
list[int]
表示“列表中的第 int 项”,而不是“表示包含 int 的列表的类型注释。 ”

原始函数中的类型注释不会触发其中任何一个,因为此时,

list
尚未重新定义。

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