2010-09-15 5 views
9

Ich habe gelesen, wann Assert vs Ausnahmen zu verwenden, aber ich bin immer noch nicht "es bekommen". Es scheint, als wenn ich denke, dass ich in einer Situation bin, in der ich Assert verwenden sollte, später in der Entwicklung finde ich, dass ich "schaue, bevor ich springe", um sicherzustellen, dass die Behauptung nicht versagt, wenn ich die Funktion rufe. Da es ein anderes Python-Idiom gibt, das es vorzieht, try-except zu verwenden, schaffe ich es im Allgemeinen, die Assertion zu verwerfen und stattdessen eine Ausnahme auszulösen. Ich muss noch einen Ort finden, an dem es richtig erscheint, eine Behauptung zu verwenden. Kann mir jemand ein gutes Beispiel geben?Beispiel Verwendung von Assert in Python?

Antwort

20

Eine gute Richtlinie assert verwendet, wenn seine Auslösemittel einen Bug in Ihrem Code. Wenn Ihr Code etwas annimmt und auf der Annahme beruht, wird empfohlen, diese Annahme mit einer assert zu schützen. Dieses assert Fehler bedeutet, dass Ihre Annahme nicht korrekt ist, was bedeutet, dass Ihr Code nicht korrekt ist.

3

Allgemein, Assert ist es, eine Annahme zu überprüfen, die Sie über Ihren Code haben, d. H. Zu diesem Zeitpunkt ist entweder die Assert erfolgreich, oder Ihre Implementierung ist irgendwie fehlerhaft. Eine Ausnahme ist eigentlich ein Fehler zu erwarten und "umarmen", d. H. Es Ihnen erlauben, damit umzugehen.

3

Ein gutes Beispiel ist die Überprüfung der Argumente einer Funktion für Konsistenz:

def f(probability_vector, positive_number): 
    assert sum(probability_vector) == 1., "probability vectors have to sum to 1" 
    assert positive_number >= 0., "positive_number should be positive" 
    # body of function goes here 
+1

Interessant - Ich wusste nicht, dass '0.' eine Abkürzung für' 0.0' war. repl sagt es ist aber. Ich könnte es jedoch nicht in echtem Code verwenden, weil es übermäßig "clever" erscheint und leicht übersehen wird. Könnte als Tippfehler verstanden werden, aber 0.0 wird immer als Float verstanden. – Daenyth

+0

Das ähnelt einer Situation, in der ich eine Funktion hatte, die ein Element aus einer 2D-Matrix holte. Es machte Sinn zu behaupten, dass die Zeilen- und Spalteneingaben tatsächlich in den Grenzen der Matrix lagen. Aber später habe ich etwas gemacht, wo ich ein Element genommen habe und etwas mit angrenzenden Elementen machen wollte. Als ich anfing, dies zu programmieren, musste ich spezielle Fälle haben, wenn das Element am Rand war, weil benachbarte Elemente außerhalb der Matrix waren. Es schien besser, stattdessen Ausnahmen zu verwenden. – Colin

+0

Wie würden Ausnahmen die Änderung des Codes erleichtern? Wenn Sie das Verhalten der Funktion ändern, müssen Sie den Ausnahmeerhöhungsabschnitt noch ändern, nicht wahr? – pberkes

15

neigen dazu, Assert zu verwenden, um nach Dingen zu suchen, die nie passieren sollten. so etwas wie eine Plausibilitätsprüfung.

Eine andere Sache, zu erkennen, dass asserts entfernt werden, wenn optimiert:

Der aktuelle Code-Generator sendet keinen Code für eine assert-Anweisung, wenn Optimierung bei der Kompilierung angefordert wird.

+4

+1, um darauf hinzuweisen, dass das, was behauptet wird, entfernt werden, wenn Sie Python mit dem '-O'-Flag aufrufen.Der Punkt ist, dass, wenn Sie erwarten, dass sich Ihr Code jemals anders verhält, wenn Sie die Behauptungen herausnehmen, dann missbrauchen Sie sie - sie dienen nur dem Debuggen. –

Verwandte Themen