1 回答

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
這些類(lèi)型都不好。是List
不變的,意味著 aList[X]
不能替代except和完全相等。同樣,并不意味著且同樣適用于。List[Y]
X
Y
A <: Base
List[A] <: List[Base]
B
PEP 484:協(xié)變和逆變
[...]
默認(rèn)情況下,泛型類(lèi)型在所有類(lèi)型變量中被認(rèn)為是不變的,這意味著用類(lèi)型注釋的變量值List[Employee]
必須與類(lèi)型注釋完全匹配——不允許類(lèi)型參數(shù)的子類(lèi)或超類(lèi)(在本例中Employee
) 。
雖然可以重新解釋此操作的類(lèi)型,但這并不明確。保守的類(lèi)型檢查器將拒絕該操作而不是猜測(cè)。
諸如此類(lèi)的可變?nèi)萜?code>List是不變的,因?yàn)樵丶瓤梢?em>插入(逆變)列表,也可以從(協(xié)變)列表中取出。如果不需要可變性,則使用不可變序列提供有效的類(lèi)型注釋:
from?typing?import?Sequencea:?Sequence[A]?=?[] b:?Sequence[B]?=?[] c:?Sequence[Base]?=?[*a,?*b]
如果需要可變性,可以顯式枚舉List
.?即使每個(gè)單獨(dú)的列表實(shí)際上只包含一種類(lèi)型,這也會(huì)預(yù)先擴(kuò)大列表中預(yù)期的元素。
a:?List[Union[A,?B]]?=?[] b:?List[Union[A,?B]]?=?[] c:?List[Union[A,?B]]?=?a?+?b
先發(fā)制人地?cái)U(kuò)大操作數(shù)的類(lèi)型可能是不可取的或不可能的。或者,也可以cast
在使用現(xiàn)場(chǎng)進(jìn)行安裝。
a:?List[A]?=?[] b:?List[B]?=?[] c:?List[Union[A,?B]]?=?cast(List[Union[A,?B]],?a)?+?cast(List[Union[A,?B]],?a)
請(qǐng)注意,這cast
實(shí)際上禁用了對(duì)強(qiáng)制轉(zhuǎn)換值的類(lèi)型檢查。僅在已知正確的情況下使用它。
添加回答
舉報(bào)