from typing import Listclass Base(object): passclass A(Base): passclass B(Base): passa: List[A] = []b: List[B] = []c: List[Base] = a + b我正在Expected type 'List[A]' (matched generic type 'List[_T]'), got 'List[B]' instead繼續b。我如何獲得正確的警告,因為顯然類型很好。
1 回答

當年話下
TA貢獻1890條經驗 獲得超9個贊
這些類型都不好。是List
不變的,意味著 aList[X]
不能替代except和完全相等。同樣,并不意味著且同樣適用于。List[Y]
X
Y
A <: Base
List[A] <: List[Base]
B
PEP 484:協變和逆變
[...]
默認情況下,泛型類型在所有類型變量中被認為是不變的,這意味著用類型注釋的變量值List[Employee]
必須與類型注釋完全匹配——不允許類型參數的子類或超類(在本例中Employee
) 。
雖然可以重新解釋此操作的類型,但這并不明確。保守的類型檢查器將拒絕該操作而不是猜測。
諸如此類的可變容器List
是不變的,因為元素既可以插入(逆變)列表,也可以從(協變)列表中取出。如果不需要可變性,則使用不可變序列提供有效的類型注釋:
from?typing?import?Sequencea:?Sequence[A]?=?[] b:?Sequence[B]?=?[] c:?Sequence[Base]?=?[*a,?*b]
如果需要可變性,可以顯式枚舉List
.?即使每個單獨的列表實際上只包含一種類型,這也會預先擴大列表中預期的元素。
a:?List[Union[A,?B]]?=?[] b:?List[Union[A,?B]]?=?[] c:?List[Union[A,?B]]?=?a?+?b
先發制人地擴大操作數的類型可能是不可取的或不可能的?;蛘撸部梢?code>cast在使用現場進行安裝。
a:?List[A]?=?[] b:?List[B]?=?[] c:?List[Union[A,?B]]?=?cast(List[Union[A,?B]],?a)?+?cast(List[Union[A,?B]],?a)
請注意,這cast
實際上禁用了對強制轉換值的類型檢查。僅在已知正確的情況下使用它。
添加回答
舉報
0/150
提交
取消