亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

預期類型“List[A]”(匹配泛型類型“List[_T]”),在正確類型的列表上得到

預期類型“List[A]”(匹配泛型類型“List[_T]”),在正確類型的列表上得到

蕪湖不蕪 2023-12-20 19:56:08
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]XYA <: BaseList[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實際上禁用了對強制轉換值的類型檢查。僅在已知正確的情況下使用它。


查看完整回答
反對 回復 2023-12-20
  • 1 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號