Die Python-Dokumentation für except
lautet:
Für eine Ausnahmeklausel mit einem Ausdruck, dieser Ausdruck ist ausgewertet, und die Klausel entspricht der Ausnahme, wenn das resultierende Objekt ist "Kompatibel" mit Ausnahme. Ein Objekt ist mit einer Ausnahme kompatibel Wenn die Klasse oder eine Basisklasse des Ausnahmeobjekts ist , [...]
Warum verwendet except
isinstance
nicht, um Basisklassen zu vergleichen? Dies verhindert die Verwendung von __instancecheck__
zum Überschreiben der Instanzprüfung.
BEARBEITEN:
Ich kann verstehen, dass einer der Gründe dafür nicht existiert, dass niemand darüber nachgedacht hat. Aber gibt es Gründe, warum dies nicht umgesetzt werden sollte?
BEARBEITEN:
Shell-Sitzung von Python 3.2a zeigt, dass die Verwendung von __subclasscheck__
nicht funktioniert:
Die einfache Antwort ist wahrscheinlich, dass niemand darüber nachgedacht hat. Eine komplexere Antwort wäre, dass niemand darüber nachgedacht hat, weil es schwierig ist, dies richtig zu machen, weil dies die Ausführung von potenziell beliebigem Python-Code während der Behandlung einer Ausnahme bedeuten würde und dass es von zweifelhaftem Wert ist. Ausnahmeklassen in Python sind in der Regel sehr einfache Klassen, deren Überladung oft mit Fehlern behaftet ist. Es ist schwer vorstellbar, dass man sich mit __instancecheck__
beraten lässt. Wenn du einen solchen Fall hast (mit oder ohne Patch), füge einen Fehler ein und jemand könnte ihn aufheben.
Aber gibt es Gründe dafür? sollte nicht implementiert werden?
Können Sie ein Beispiel geben, wo dies nützlich wäre?
Wenn Sie dies tun:
%Vor% Python ruft __subclasscheck__
auf SomeType
's Metaklasse auf, um zu bestimmen, ob Something
eine Unterklasse von SomeType
ist. Die Metaclass PEP spricht darüber ausführlicher.
Tags und Links python exception-handling exception types isinstance