List
ist eine Unterklasse von Sequence
:
aber List[str]
ist keine Unterklasse von Sequence[str]
:
Warum?
Welchen Nutzen hätte eine IS-A-Beziehung zwischen
List[str]
undSequence[str]
beim Kommentieren?
Dies ist der wichtigste Punkt, der weggenommen werden muss. Die Überprüfung, ob ein Typ ein Subtyp eines anderen Typs ist, ist im Allgemeinen nicht das, was Sie tun sollten, während Sie Ihren Code mit Anmerkungen versehen. Dies ist in der Regel etwas, das bemerkt wurde, und es gibt eine Debatte über das Atomisieren von __subclasscheck__
.
Wie Mark Shannon in einem Kommentar angibt :
Es ist sinnvoll zu prüfen, ob ein Typ ein Subtyp eines Typs ist, aber das ist der Job eines statischen Checkers und gehört nicht in das Tippmodul.
Wie auch immer, die Prüfungen werden alle in GenericMeta
s __subclasscheck__
Die aktuelle Implementierung konzentriert sich eher auf Fälle, in denen der Containertyp ähnlich ist, ihre Unterskripttypen jedoch unterschiedlich sind. In diesem Fall werden Prüfungen durchgeführt, abhängig davon, ob die Subskripttypen kovariante oder kontravariante . Zum Beispiel prüfen List
-Typen als solche nicht auf eine subtype
-Beziehung mit:
gibt false zurück. Für Sequenzen sind die Typen kovariant. Daher ergibt sich True
:
Auf der anderen Seite für Typen ohne einen bestimmten Typ (wie im ersten Fall):
%Vor% __subclasscheck__
in GenericMeta
Delegieren an __subclasscheck__
in ABCMeta
wo es auf True
ausgewertet wird.
Schließlich, wenn die zwei Typen unterschiedlich sind, wie in:
%Vor% und die Basisklasse im Aufruf issubclass
ist eine Instanz von GenericMeta
, False
wird zurückgegeben. Diese Bedingung ist für die meisten Typen in typing
erfüllt.
Was auch immer der Fall ist, es ist erwähnenswert, dass dies in einer zukünftigen Version möglicherweise nicht der Fall sein wird, oder dass sein Verhalten völlig anders sein könnte; Das Modul ist noch provisorisch.
Tags und Links python python-3.x type-hinting