Wie funktioniert isinstance für List?

8

Ich versuche zu verstehen, wie Pythons Typ-Annotationen funktionieren (z. B. List und Dict - nicht list oder dict ). Insbesondere interessiert mich, wie isinstance(list(), List) funktioniert, so dass ich meine eigenen benutzerdefinierten Anmerkungen erstellen kann.

Ich sehe, dass List definiert ist als:

%Vor%

Ich bin mit metaclass = xxx vertraut, aber ich kann keine Dokumentation zu diesem extra = xxx finden. Ist das ein Schlüsselwort oder nur ein Argument, und wenn ja, woher kommt es und tut es, wonach ich suche? Ist es sogar relevant für isinstance ?

    
c z 23.05.2017, 11:05
quelle

1 Antwort

8

Die isinstance() und issubclass() haben Hooks in object.__instancecheck__() und object.__subclasscheck__() , die auch die typing -Generika verwenden .

Wenn Sie Ihre eigenen Generika bereitstellen möchten, möchten Sie die % co_de wirklich studieren % Modul-Quellcode , insbesondere wie typing und GenericMeta werden verwendet, um den anderen zu definieren Generische Typen wie Generic ; Meist werden solche Prüfungen an List delegiert. Sie können Ihr eigenes ABC mit einem solchen Hook definieren und dann ein Generic definieren, das es unterklassifiziert.

Es ist hier die Metaclass abc.ABCMeta.__subclasshook__ , die auch das Argument GenericMeta keyword gibt. Solche Interna sind noch spärlich dokumentiert, da die extra Implementierung noch im Fluss ist, das Modul ist immer noch < em> vorläufig . Das typing Argument wird als extra gespeichert und wird in einem verwendet benutzerdefinierte __extra__ Implementierung ; Für __subclasshook__ reicht es aus, extra=list in isinstance(something, List) zu übersetzen.

Beachten Sie, dass die Unterstützung für Laufzeitprüfungen absichtlich begrenzt ist; Statische Typüberprüfer führen diese Hooks nicht aus. In der Diskussion zur Strukturunterteilung im mypy tracker finden Sie weitere Informationen darüber, wie die Entwickler darüber nachdenken, wie sie besseren Support bieten können für komplexe benutzerdefinierte Klassen, die möglicherweise nicht genügend Methoden implementieren, um als eine Zuordnung oder eine Sequenz oder ähnliches zu gelten.

    
Martijn Pieters 23.05.2017, 11:11
quelle