Grundlegende Frage: Was ist der pythisch / logischste Weg, eigene, benutzerdefinierte Warnungsklassen zu erstellen? Was sind die richtigen Warn- und Ausnahmeklassen, die ich unterklassifizieren sollte?
Motivation : Die Anforderungen an die Bibliothek, die ich schreibe, legen fest, dass ein MyContainer
object c
ein Element x
enthält und der Aufrufer der Bibliothek versucht, ein "Duplikat" zu platzieren "of x
- nennen Sie es y
- in c
, es wird eine Warnung an den Aufrufer ausgegeben und der Rückgabewert von c.my_transformation_method(x, y)
wird in c
platziert, um x
zu ersetzen. Mit anderen Worten, MyContainer
s ersetzt Elemente durch ihre Duplikate, muss den Benutzer jedoch warnen.
Basierend auf meiner Lektüre ist der flexibelste Weg, den Aufrufer einer Bibliothek vor einer nicht-tödlichen Aktion zu warnen, mit der Warnungs-Standardmodul . Es ermöglicht dem Aufrufer, die Warnung so zu behandeln, wie sie es für richtig hält, indem sie Warnungen ignoriert und sie als Fehler behandelt. (Beachten Sie, dass ich Python 3 verwende, aber ich glaube nicht, dass das für die Frage wichtig ist.)
Beispiel: Was ich getan habe, ist die folgende warnende Unterklasse definiert:
%Vor% Dann ruft die Methode add()
von MyContainer
warnings.warn('detected duplicate', DuplicateItemWarning)
auf, wenn sie einen Versuch entdeckt, ein doppeltes Objekt einzufügen.
Spezifische Fragen:
Soll ich UserWarning
wie oben beschrieben ableiten oder nur subclassing Warning
?
Es scheint semantisch sinnvoll, die Unterklasse ValueError
(die im obigen Beispiel lediglich ValueError
in die MRO zwischen Warning
und Exception
einfügt) für den Fall, dass ein Aufrufer Warnungen als Fehler behandeln möchte, sinnvoll zu verwenden . Gibt es einen Nachteil, den ich nicht sehe?
Ich konnte keine vorherigen Fragen zu StackOverflow zum Anpassen von Warnungsklassen finden. Liegt das daran, dass Python-Programmierer das Modul warnings
nicht einmal gerne benutzen?
Nachdem ich die PEP 230 über den Warnungsrahmen und die Warnhinweise gelesen habe, denke ich, dass ich das getan habe die Antwort auf deine Fragen:
UserWarning
und alle anderen sind Warnkategorien, sie scheinen keine andere Rolle als nur die Klassifizierung zu haben. So können Sie sie beispielsweise in Ihrer Produktionsumgebung herausfiltern. Sie können also grundsätzlich von Warning
ableiten, wenn die Warnung nicht in eine andere Kategorie fällt. Wenn im Kontext , UserWarning
oder RuntimeWarning
ausreichend erscheinen, verwenden Sie sie einfach.
Warning
s sind bereits Exception
s. Also, technisch, um sie als Fehler zu "fangen", müssen Sie nur den Filter ändern, keine Unterklasse von XXXError
. Jetzt geht es wieder darum, Sinn zu machen. Wenn sich die Warnungen auf die übergebenen Werte beziehen, könnten Sie eine Unterklasse von ValueError
erstellen. Insbesondere wenn es viele verschiedene benutzerdefinierte Warnungen gäbe, würden Sie erwarten, dass der Aufrufer alle Warnungen bezüglich der Werte auf einmal abfängt.
Das Modul warnings
ist die Idee von Guido van Rossum. (Siehe PEP 230). Wenn das nicht Pythonic genug ist ...: D
Tags und Links python python-3.x warnings