【发布时间】:2017-12-06 11:13:59
【问题描述】:
我正在尝试在 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__',但我已经在运行 IDE 的 2017.1.4 版本,并且问题中提到的错误仅影响返回类型的提示(似乎)。
【问题讨论】:
-
我不知道 "self.value: T = None" 语法中 : 的含义。有人可以帮我指出一些文档以了解更多信息吗?很抱歉垃圾邮件 - 我糟糕的谷歌技能也没有帮助我获得任何有意义的搜索结果。
-
你看过他的检查器mypy-lang.org吗?
-
@c0dec0de python.org/dev/peps/pep-0526
-
感谢@AshwiniChaudhary,这似乎是 python 3.x 特有的,我了解到我们可以像 go 和许多其他语言一样为变量设置显式类型。再次感谢。
标签: python generics pycharm type-hinting