慕的地8271018
2023-04-18 15:30:59
我創(chuàng)建了一個(gè)類(lèi)似字典的自定義類(lèi)來(lái)簡(jiǎn)化跨大型數(shù)據(jù)集的合并評(píng)估指標(biāo)。此類(lèi)實(shí)現(xiàn)了一種__add__方法來(lái)匯總各種指標(biāo)。這是我正在處理的代碼的簡(jiǎn)化版本:from __future__ import annotationsfrom typing import TypeVar, DictT = TypeVar('T', int, float)class AddableDict(Dict[str, T]): def __add__(self, other: AddableDict[T]) -> AddableDict[T]: if not isinstance(other, self.__class__): raise ValueError() new_dict = self.__class__() all_keys = set(list(self.keys()) + list(other.keys())) for key in all_keys: new_dict[key] = self.get(key, 0) + other.get(key, 0) return new_dict# AddableIntDict = AddableDict[int]# this would work just fine, however I need to add a few additional methodsclass AddableIntDict(AddableDict[int]): def some_int_specific_method(self) -> None: passdef main() -> None: x = AddableIntDict() y = AddableIntDict() x['a'] = 1 y['a'] = 3 x += y # breaks mypy該程序的最后一行中斷了 mypy (0.782),并出現(xiàn)以下錯(cuò)誤:error: Incompatible types in assignment (expression has type "AddableDict[int]", variable has type "AddableIntDict")這個(gè)錯(cuò)誤對(duì)我來(lái)說(shuō)很有意義。AddableIntDict當(dāng)我定義為 的類(lèi)型別名時(shí),代碼工作正常AddableDict[int],如我的評(píng)論中所述,但是因?yàn)槲倚枰鶕?jù)字典值的類(lèi)型添加其他方法,如 所示some_int_specific_method,我不能簡(jiǎn)單地使用類(lèi)型別名。任何人都可以指出正確的方向,了解如何注釋父類(lèi)的__add__方法,以便它返回調(diào)用類(lèi)的類(lèi)型嗎?(我使用的是 Python 3.8.3)
1 回答

手掌心
TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
self可以通過(guò)使用類(lèi)型變量來(lái)引用“的類(lèi)型”。這解析為調(diào)用該方法的基類(lèi)或子類(lèi)的適當(dāng)類(lèi)型:
from typing import TypeVar, Dict
T = TypeVar('T', int, float)
AD = TypeVar('AD', bound='AddableDict')
class AddableDict(Dict[str, T]):
def __add__(self: AD, other: AD) -> AD: ...
class AddableIntDict(AddableDict[int]):
def some_int_specific_method(self) -> None: ...
x = AddableIntDict(a=1)
y = AddableIntDict(a=3)
x += y # works for mypy and others
添加回答
舉報(bào)
0/150
提交
取消