我想使用内置类型注释
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 中内置类型注释,打字模块似乎已经过时了。所以,我宁愿使用内置功能而不是模块。
发生这种情况是因为您有一个名为
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
尚未重新定义。