我有代码,我用两个类型变量定义泛型类:
Selected = ty.TypeVar('Selected')
SelectionIDs = ty.TypeVar('SelectionIDs')
class GenericSelection(col.UserDict, ty.Mapping[SelectionIDs, Selected]):
def __init__(self):
super().__init__()
然后我想派生前一个泛型类的子类,我想在其中指定一个类型变量作为整数序列(在这种情况下是一个索引)。
class IndexedSelection(GenericSelection[int, Selected]):
def __init__(self):
super().__init__()
然后我想将Selected type变量定义为特定类型的对象,比如str
,根据documentation和PEP 483这是允许的。
class StrSelection(IndexedSelection[str]):
def __init__(self, strings: ty.Sequence[str], sel: ty.Sequence[int]):
super().__init__()
for sel_idx in sel:
self[sel_idx] = strings[sel_idx]
然而,我收到错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/salotz/Dropbox/tutorials/python_types/typing_class.py in <module>()
47 super().__init__()
48
---> 49 class StrSelection(IndexedSelection[str]):
50 def __init__(self, strings: ty.Sequence[str], sel: ty.Sequence[int]):
51 super().__init__()
/home/salotz/anaconda3/lib/python3.5/typing.py in __getitem__(self, params)
968 if len(params) != len(self.__parameters__):
969 raise TypeError("Cannot change parameter count from %d to %d" %
--> 970 (len(self.__parameters__), len(params)))
971 for new, old in zip(params, self.__parameters__):
972 if isinstance(old, TypeVar):
TypeError: Cannot change parameter count from 2 to 1
也许我误解了Generic类型的作用,因为周围没有很多例子。我错过了一些让这个工作的东西吗?