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 GenericMeta
s __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.
Dlaczego powinno to być? 'List [str]' i 'Sequence [str]' są jak instancje; określone formy rodzaju ogólnego. 'list()' nie jest podklasą 'abc.Sequence()'. –
Lub inaczej: * Jaki użytek * miałby stosunek IS-A pomiędzy 'List [str]' a 'Sequence [str]' podczas adnotacji? –