2016-07-17 23 views
8

List jest podklasą Sequence:Dlaczego Lista [str] nie podklasą Sequence [str]

>>> from typing import List, Sequence 
>>> issubclass(List, Sequence) 
True 

ale List[str] nie jest podklasą Sequence[str]:

>>> issubclass(List[str], Sequence[str]) 
False 

Dlaczego?

+1

Dlaczego powinno to być? 'List [str]' i 'Sequence [str]' są jak instancje; określone formy rodzaju ogólnego. 'list()' nie jest podklasą 'abc.Sequence()'. –

+0

Lub inaczej: * Jaki użytek * miałby stosunek IS-A pomiędzy 'List [str]' a 'Sequence [str]' podczas adnotacji? –

Odpowiedz

1

Jakie zastosowanie miałaby relacja IS-A między List[str] i Sequence[str] podczas adnotacji?

Jest to główny punkt do zabrania. Sprawdzenie, czy dany typ jest podtypem innego typu, nie jest zwykle czymś, co powinieneś robić podczas pisania adnotacji kodu. Jest to na ogół coś, co zostało zauważone i jest powodem debaty na temat the nuking of __subclasscheck__.

Jak Mark Shannon states in a comment:

Jest to sensowne, aby sprawdzić, czy dany typ jest podtypem typu, ale to jest zadanie statycznego sprawdzania i nie należy w module pisania.

Tak czy inaczej, kontrole są all made in GenericMetas __subclasscheck__, metaklasą dla typów generycznych

AS jest obecna implementacja jest bardziej skupiony na przypadkach, gdy typ pojemnika jest podobny, ale ich typy sub-skrypty różnią się, w tym case, kontrole są dokonywane w zależności od tego, czy typy podskryptowane to covariant or contravariant. Na przykład, List typy są ani jako takie, sprawdzając na subtype relacji z:

issubclass(List[bool], List[int]) # checks if bool == int 

zwraca false. Dla sekwencji, rodzaje są kowariantna jako taki następujących rentowności True:

issubclass(Sequence[bool], Sequence[int]) # checks if bool is a subclass of int 

Z drugiej strony, dla typów bez określonego typu (jak w pierwszym przypadku):

issubclass(List, Sequence) 

__subclasscheck__ w GenericMeta będzie delegate do delegate do __subclasscheck__ in ABCMeta gdzie będzie oceniać True.

Wreszcie, jeżeli te dwa rodzaje różnią się, na przykład:

issubclass(List[str], Sequence[str]) 

i klasy bazowej w issubclass call is an instance of GenericMeta, False jest zwrócony; ten warunek jest spełniony dla większości typów w typing.

Niezależnie od przypadku warto wspomnieć, że może nie istnieć w przyszłym wydaniu lub jego zachowanie może być zupełnie inne; moduł jest nadal tymczasowy.