我有以下代码:
from typing import List, NewType
MultiList = NewType("MultiList", List[List[int]])
def myfunc():
multi: MultiList = []
# More stuff here
代码工作得很好,这只是我的IDE (PyCharm)不喜欢multi
的实例化为空列表,我得到这个错误:
"预期类型'MultiList',得到'list[list[int]]'而不是'
我的意思是,MultiList
是一个list[list[int]]
,所以我真的不知道为什么它在抱怨。除非是因为列表是空的,但这对我来说也没有多大意义。
这不是世界末日,代码工作得很好,我只是想知道为什么它被标记为错误。
typing.NewType
的全部目的是将一种类型与另一种类型区分开来,并将其视为一个子类型。您将其注释为MultiList
,它被视为list
的子类型,因此分配list
实例是错误的。
您需要正确实例化MultiList
。例子:
def myfunc():
multi: MultiList = MultiList([])
如果您想要一个类型别名,那么您不应该使用NewType
,而应该使用TypeAlias
:
from typing import TypeAlias
MultiList: TypeAlias = list[list[int]]
def myfunc():
multi: MultiList = []
p:除非你使用的是过时的Python版本,否则你应该使用标准的泛型别名类型,即list
而不是typing.List
。
如果你的意思是"列表的列表",那么就不要使用NewType:
MultiList = List[List[int]]
NewType适用于如果你不希望将int型列表的任意列表视为MultiList。对于NewType,静态类型检查器只会在显式调用MultiList时将对象视为MultiList:
MultiList = NewType("MultiList", List[List[int]])
multi: MultiList = MultiList([])