我正在尝试在 Python 中实现一种自定义序列类:
from typing import Sequence, TypeVar, List
T = TypeVar('T')
class MySequence(Sequence[T]):
def __init__(self):
self._container: Sequence[T] = []
def __getitem__(self, idx):
return self._container[idx]
def __len__(self):
return len(self._container)
现在我想检查mypy是否知道元素MySequence
是类型的项目T
:
foo: MySequence[str] = MySequence()
reveal_type(foo[0])
# Revealed type is 'Any'
所以它失败了:mypy对foo
. 普通Sequence
作品同样的例子:
bar: Sequence[str] = []
reveal_type(bar[0])
# Revealed type is 'builtins.str*'
如果我尝试将类型注释添加到__getitem__
实现中,则会出现另一个错误:
def __getitem__(self, idx) -> T:
# Signature of "__getitem__" incompatible with supertype "Sequence"
我也试过
def __getitem__(self, idx) -> Union[T, Sequence[T]]:
asidx
可以是切片,在这种情况下,我的代码将返回一个序列而不是一个元素。它会失败并显示相同的消息。
正如我在上一个问题中所讨论的那样,对此类问题进行了公开讨论。
但是,我仍然想知道,是否可以创建自定义序列类型,允许mypy提取有关其项目类型的信息,就像在我的示例中一样?