如何为Sequence [T]提供泛型类型参数?

时间:2017-07-03 08:47:37

标签: python generics pycharm type-hinting

我正在尝试在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只会影响返回类型的暗示(似乎)。

1 个答案:

答案 0 :(得分:1)

看起来我必须从Generic[T]继承列表。我不确定为什么,我认为Sequence[T]已经为我做了。也许有人可以解释这方面的背景。

class MyGenericList(Generic[T], Sequence[T]):
    def __init__(self):
        self.store: Sequence[T] = []

根据关于泛型如何工作的原始注释,这似乎是PyCharm的一个错误,并且不应该要求Generic[T]的额外推导......