Pythonic, benutzerdefinierte Warnungen

9

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:

  1. Soll ich UserWarning wie oben beschrieben ableiten oder nur subclassing Warning ?

  2. 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?

  3. 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?

wkschwartz 25.04.2012, 18:51
quelle

1 Antwort

4

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:

  1. 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.

  2. 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.

    %Vor%
  3. Das Modul warnings ist die Idee von Guido van Rossum. (Siehe PEP 230). Wenn das nicht Pythonic genug ist ...: D

jadkik94 25.04.2012, 20:16
quelle

Tags und Links