问题描述
from typing import List
class Base(object):
pass
class A(Base):
pass
class B(Base):
pass
a: List[A] = []
b: List[B] = []
c: List[Base] = a + b
我在Expected type 'List[A]' (matched generic type 'List[_T]'),got 'List[B]' instead
上得到b
。
如何获得正确的警告,显然类型很好。
解决方法
这些类型不好。 List
是不变的,这意味着List[X]
不能代替List[Y]
,除非X
和Y
完全相等。类似地,A <: Base
并不暗示List[A] <: List[Base]
,对于B
同样。
PEP 484: Covariance and contravriance
[...]
默认情况下,泛型类型在所有类型变量中都被认为是不变的,这意味着用List[Employee]
这样的类型注释的变量的值必须与类型注释完全匹配-类型参数的子类或超类(在此示例中{{1 }})。
诸如Employee
之类的可变容器是不变的,因为元素既可以插入到(变量),又可以从中取出(协变量)。如果不需要可变性,则使用不可变的Sequence可提供有效的类型注释:
List
,
在PyCharm中,您可以在收到警告的行上方键入“#noinspection PyTypeChecker”。