我試圖實現一種自定義的序列類在Python:子類序列可以用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]]:
因爲idx
可以是一個切片,在這種情況下,我的代碼將返回一個序列而不是一個元素。它使用相同的消息失敗。
正如my previous question討論,對這樣的問題進行open discussion。
但是,我仍然想知道,是否可以創建自定義序列類型,允許mypy提取有關其項目類型的信息,如我的示例中所示?
需要注意的是(至少在我的機器上)的@overload事項的順序。如果切換順序,那麼我得到錯誤:「__getitem__」的簽名與第一個@overload上的超類型「Sequence」不兼容。 –