Warum ist List [str] keine Unterklasse von Sequence [str]?

8

List ist eine Unterklasse von Sequence :

%Vor%

aber List[str] ist keine Unterklasse von Sequence[str] :

%Vor%

Warum?

    
Michael Amrhein 17.07.2016, 20:41
quelle

1 Antwort

1
  

Welchen Nutzen hätte eine IS-A-Beziehung zwischen List[str] und Sequence[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 Metaklasse für generische Typen

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:

%Vor%

gibt false zurück. Für Sequenzen sind die Typen kovariant. Daher ergibt sich True :

%Vor%

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.

    
Jim Fasarakis Hilliard 18.07.2016 00:12
quelle

Tags und Links