Je suis en train de mettre en œuvre une sorte de classe de séquence personnalisée en Python:Subclassing Séquence avec des notes de type approprié en 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)
Maintenant, je veux vérifier que mypy est conscient du fait que les éléments de MySequence
sont des éléments de type T
:
foo: MySequence[str] = MySequence()
reveal_type(foo[0])
# Revealed type is 'Any'
il échoue: mypy ne sait rien sur les éléments de foo
. Le même exemple pour Sequence
ordinaire fonctionne:
bar: Sequence[str] = []
reveal_type(bar[0])
# Revealed type is 'builtins.str*'
Si je suis en train d'ajouter des annotations de type à __getitem__
mise en œuvre, j'ai une autre erreur:
def __getitem__(self, idx) -> T:
# Signature of "__getitem__" incompatible with supertype "Sequence"
J'ai aussi essayé
def __getitem__(self, idx) -> Union[T, Sequence[T]]:
comme idx
peut être une tranche et dans ce cas mon code retournera une séquence au lieu d'un élément. Il échoue soit avec le même message. Comme discuté dans my previous question, il ya un open discussion sur des questions comme ça.
Cependant, je me demande encore, est-il possible de créer des types de séquence personnalisés qui permettent mypy d'extraire des informations sur le type de ses éléments, comme dans mon exemple?
Notez que (au moins sur ma machine) l'ordre de @overload est important. Si je commute l'ordre, j'obtiens 'error: Signature de" __getitem__ "incompatible avec supertype" Sequence "' sur le premier @overload. –