我正在尝试在Python中创建一个存储T
类型元素的列表,但是,我不知道如何为这样的列表实例指定具体类型。
对于非列表实例,实现非常明确:
from typing import TypeVar, Generic
T = TypeVar("T")
class MyGenericType(Generic[T]):
def __init__(self):
self.value: T = None
generic_instance: MyGenericType[int] = MyGenericType()
最后一行按预期工作:它生成T
int
个实例,然后我可以在其中存储这些值。
对于列表,我写了以下内容:
from typing import TypeVar, Sequence
T = TypeVar("T")
class MyGenericList(Sequence[T]):
def __init__(self):
self.store: Sequence[T] = []
# abstract method implementations cut for brevity
generic_list: MyGenericList[int] = MyGenericList()
最后一行应该创建一个存储int
元素的列表,但我的IDE(PyCharm)抱怨第一个开放的方括号:
类'ABCMeta'未定义'__getitem__',因此'[]'运算符不能用于其实例
显然它试图通过索引操作符访问列表元素,但是,我想在这个地方具体说明泛型类型。这是不可能的还是我做错了什么?
这可能只是一个PyCharm错误吗?这听起来与Python 3.5 Typing ABCMeta does not define '__getitem__'类似,但我已经在运行2017.1.4版本的IDE了,问题中提到的bug只会影响返回类型的暗示(似乎)。
答案 0 :(得分:1)
看起来我必须从Generic[T]
继承列表。我不确定为什么,我认为Sequence[T]
已经为我做了。也许有人可以解释这方面的背景。
class MyGenericList(Generic[T], Sequence[T]):
def __init__(self):
self.store: Sequence[T] = []
根据关于泛型如何工作的原始注释,这似乎是PyCharm的一个错误,并且不应该要求Generic[T]
的额外推导......