预期类型为“列表[A]”匹配的通用类型为“列表[_T]”,但在正确键入的列表上得到了“列表[B]” PEP 484: Covariance and contravriance

问题描述

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],除非XY完全相等。类似地,A <: Base并不暗示List[A] <: List[Base],对于B同样。

PEP 484: Covariance and contravriance

[...]
默认情况下,泛型类型在所有类型变量中都被认为是不变的,这意味着用List[Employee]这样的类型注释的变量的值必须与类型注释完全匹配-类型参数的子类或超类(在此示例中{{1 }})。


诸如Employee之类的可变容器是不变的,因为元素既可以插入到(变量),又可以中取出(协变量)。如果不需要可变性,则使用不可变的Sequence可提供有效的类型注释:

List
,

在PyCharm中,您可以在收到警告的行上方键入“#noinspection PyTypeChecker”。