5

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が の要素がMySequencetype のアイテムであることを認識していることを確認したいと思います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がアイテムのタイプに関する情報を抽出できるようにするカスタム シーケンス タイプを作成することは可能でしょうか?

4

1 に答える 1