Próbuję utworzyć listę przechowującą elementy typu T
w Pythonie jednak nie wiem, jak określić konkretny typ instancji takiej listy.
W przypadku instancji nie znajdujących się na liście wdrożenie jest dość jasne:
from typing import TypeVar, Generic
T = TypeVar("T")
class MyGenericType(Generic[T]):
def __init__(self):
self.value: T = None
generic_instance: MyGenericType[int] = MyGenericType()
Ostatnia linia działa po prostu zgodnie z oczekiwaniami: tworzy T
przypadki int
i mogę przechowywać w nim takie wartości.
W przypadku list tak napisałem:
from typing import TypeVar, Sequence
T = TypeVar("T")
class MyGenericList(Sequence[T]):
def __init__(self):
self.store: Sequence[T] = []
# abstract method implementations cut for brevity
generic_list: MyGenericList[int] = MyGenericList()
Ostatni wiersz powinien utworzyć listę int
elementy, ale mój IDE (PyCharm) narzeka na pierwszy kwadratowy nawias klamrowy:
Klasa "ABCMeta" nie definiuje "__getitem__", więc operator "[]" nie może być użyty w swoich instancjach
Najwyraźniej próbował uzyskać dostęp do elementów listy za pośrednictwem operatora indeksowania, jednak chcę określić typ rodzajowy w tym miejscu. Czy to nie jest możliwe, czy robię coś złego?
Czy to może być tylko błąd PyCharm? To brzmi podobnie do Python 3.5 Wpisywanie ABCMeta nie definiuje "__getitem__", ale już korzystam z wersji IDE 2017.1.4, a błąd wspomniany w pytaniu dotyczy tylko wskazówek dotyczących typów zwrotu (wydaje się).
Odpowiedzi:
1 dla odpowiedzi № 1Wygląda na to, że musiałem odziedziczyć Generic[T]
dla list również. Nie jestem pewien dlaczego, pomyślałem Sequence[T]
zrobiłbym to już dla mnie. Może ktoś może wyjaśnić to na tym tle.
class MyGenericList(Generic[T], Sequence[T]):
def __init__(self):
self.store: Sequence[T] = []
Zgodnie z oryginalnymi uwagami na temat działania generyków, wydaje się, że jest to błąd związany z PyCharm i dodatkowe wyprowadzanie z Generic[T]
nie powinno być wymagane ...