/ / Jak podać ogólny parametr typu Sekwencja [T]? - python, generics, pycharm, typ-podpowiedź

Jak podać ogólny parametr typu Sekwencja [T]? - python, generics, pycharm, typ-podpowiedź

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 № 1

Wyglą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 ...