如何为 Sequence[T] 提供泛型类型参数?
How to provide generic type parameter to Sequence[T]?
我正在尝试创建一个列表,用于在 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()
最后一行按预期工作:它生成 int
的 T
个实例,然后我可以在其中存储这些值。
对于列表,我这样写:
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) 在第一个左方括号周围抱怨:
Class 'ABCMeta' 没有定义'__getitem__',所以不能在它的实例上使用'[]'运算符
显然它试图通过索引运算符访问列表元素,但是,我想在这个地方指定通用类型。这是不可能的还是我做错了什么?
难道这只是一个 PyCharm 错误?这听起来确实类似于 ,但我已经 运行 IDE 的 2017.1.4 版本,问题中提到的错误仅影响 return 上的提示类型(似乎)。
看来我也必须从 Generic[T]
继承列表。我不确定为什么,我认为 Sequence[T]
已经为我做到了。也许有人可以解释一下这方面的背景。
class MyGenericList(Generic[T], Sequence[T]):
def __init__(self):
self.store: Sequence[T] = []
根据关于泛型如何工作的原始说明,这似乎是 PyCharm 的错误,并且不需要从 Generic[T]
进行额外的推导...
我正在尝试创建一个列表,用于在 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()
最后一行按预期工作:它生成 int
的 T
个实例,然后我可以在其中存储这些值。
对于列表,我这样写:
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) 在第一个左方括号周围抱怨:
Class 'ABCMeta' 没有定义'__getitem__',所以不能在它的实例上使用'[]'运算符
显然它试图通过索引运算符访问列表元素,但是,我想在这个地方指定通用类型。这是不可能的还是我做错了什么?
难道这只是一个 PyCharm 错误?这听起来确实类似于
看来我也必须从 Generic[T]
继承列表。我不确定为什么,我认为 Sequence[T]
已经为我做到了。也许有人可以解释一下这方面的背景。
class MyGenericList(Generic[T], Sequence[T]):
def __init__(self):
self.store: Sequence[T] = []
根据关于泛型如何工作的原始说明,这似乎是 PyCharm 的错误,并且不需要从 Generic[T]
进行额外的推导...