441 Stimmen

Warum wird NotImplemented zurückgegeben, anstatt NotImplementedError auszulösen?

Python hat ein Singleton namens NotImplemented .

Warum sollte jemand jemals zurückkehren wollen NotImplemented anstatt die NotImplementedError Ausnahme? Wird es dadurch nicht nur schwieriger, Fehler zu finden, z. B. Code, der ungültige Methoden ausführt?

407voto

SpliFF Punkte 36890

Das liegt daran, dass __lt__() und verwandte Vergleichsmethoden werden recht häufig indirekt in Listensortierungen und dergleichen verwendet. Manchmal entscheidet sich der Algorithmus für einen anderen Weg oder wählt einen Standardsieger. Das Auslösen einer Exception würde die Sortierung abbrechen, sofern sie nicht abgefangen wird, während NotImplemented wird nicht ausgelöst und kann in weiteren Tests verwendet werden.

http://jcalderone.livejournal.com/32837.html

Um diesen Link zusammenzufassen:

" NotImplemented signalisiert der Laufzeit, dass sie eine andere Person bitten soll, die Operation auszuführen. In dem Ausdruck a == b wenn a.__eq__(b) gibt zurück. NotImplemented , dann versucht Python b.__eq__(a) . Si b weiß genug, um zurückzukehren True o False dann kann der Ausdruck erfolgreich sein. Wenn dies nicht der Fall ist, greift die Laufzeitumgebung auf das eingebaute Verhalten zurück (das auf Identität für == y != )."

294voto

Paolo Punkte 17469

Weil sie unterschiedliche Anwendungsfälle haben.

Ich zitiere die Dokumentation (Python 3.6):

NotImplemented

sollte von den binären Spezialmethoden zurückgegeben werden (z. B. __eq__() , __lt__() , __add__() , __rsub__() usw.), um anzuzeigen, dass der Vorgang in Bezug auf den anderen Typ nicht ausgeführt wird

Ausnahme NotImplementedError

[...] I Klassen sollten abstrakte Methoden diese Ausnahme auslösen, wenn sie abgeleiteten Klassen verlangen, die Methode zu überschreiben, oder während die Klasse entwickelt wird, um anzuzeigen, dass die eigentliche Implementierung noch hinzugefügt werden muss.

Einzelheiten finden Sie unter den Links.

21voto

RichieHindle Punkte 256891

Ein Grund ist die Leistung. In einer Situation wie bei Rich-Vergleichen, wo man viele Operationen in kurzer Zeit durchführen kann, kann das Einrichten und Behandeln vieler Ausnahmen viel länger dauern als die einfache Rückgabe eines NotImplemented Wert.

18voto

ahsan naeem Punkte 173

Rücksendung NotImplemented durch eine Funktion ist so etwas wie die Erklärung, dass die Funktion nicht in der Lage ist, die Eingaben zu verarbeiten, aber anstatt eine Ausnahme auszulösen, wird die Kontrolle an eine andere Funktion übertragen, die als Reflexionsfunktion in der Hoffnung, dass die Reflexionsfunktion in der Lage sein wird, die Eingaben zu verarbeiten.

Erstens, die Reflexionsfunktionen die mit beliebigen Funktionen verbunden sind, sind vordefiniert. Zweitens, wenn die ursprüngliche Funktion zurückkehrt NotImplemented führt der Interpreter die Reflexionsfunktion sondern auf der umgekehrte Reihenfolge von Eingabeargumenten.

Ausführliche Beispiele finden Sie aquí

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X