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
type のアイテムであることを認識していることを確認したいと思います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
はスライスになる可能性があり、その場合、コードは 1 つの要素ではなくシーケンスを返します。同じメッセージで失敗します。
前の質問で説明したように、そのような問題についてはオープンな議論があります。
ただし、私の例のように、 mypyがアイテムのタイプに関する情報を抽出できるようにするカスタム シーケンス タイプを作成することは可能でしょうか?