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:
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
?
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.
Tags und Links python python-3.x metaclass isinstance type-hinting