我正在尝试在 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
works:
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]]:
as idx
可以是一个切片,在这种情况下,我的代码将返回一个序列而不是一个元素。它要么失败并显示相同的消息。
正如中所讨论的我之前的问题, 有一个公开讨论诸如此类的问题。
但是,我仍然想知道,是否可以创建自定义序列类型来允许mypy提取有关其项目类型的信息,就像在我的示例中一样?