Nun, dies ist eine offene Frage, und ich möchte zwei Aspekte ansprechen: wann ich Zusicherungen hinzufügen und wie ich die Fehlermeldungen schreibe.
Zweck
Um es einem Anfänger zu erklären - Behauptungen sind Aussagen, die Fehler verursachen können, aber Sie werden sie nicht fangen. Und normalerweise sollten sie nicht erzogen werden, aber im wirklichen Leben werden sie manchmal trotzdem erzogen. Und dies ist eine ernste Situation, die der Code nicht wiederherstellen kann, was wir als "schwerwiegenden Fehler" bezeichnen.
Als nächstes dient es 'Debugging-Zwecken', was, obwohl es korrekt ist, sehr abweisend klingt. Ich mag die Formulierung "Invarianten deklarieren, die niemals verletzt werden sollten" besser, obwohl sie bei verschiedenen Anfängern unterschiedlich funktioniert ... Einige "verstehen es einfach", andere finden entweder keine Verwendung dafür oder ersetzen normale Ausnahmen. oder sogar den Fluss damit steuern.
Stil
In Python assert
ist eine Anweisung keine Funktion! (Denken Sie daran, assert(False, 'is true')
wird nicht erhöhen. Aber das aus dem Weg haben:
Wann und wie wird die optionale 'Fehlermeldung' geschrieben?
Dies gilt acually zu Einheit Test - Frameworks, die oft viele engagierte Methoden zu tun haben Behauptungen ( assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
etc.). Sie bieten häufig auch die Möglichkeit, die Behauptung zu kommentieren.
Im Wegwerfcode könnten Sie auf die Fehlermeldungen verzichten.
In einigen Fällen kann der Behauptung nichts hinzugefügt werden:
def dump (etwas): isinstance (etwas, Dumpable) behaupten # ...
Abgesehen davon ist eine Nachricht nützlich für die Kommunikation mit anderen Programmierern (die manchmal interaktive Benutzer Ihres Codes sind, z. B. in Ipython / Jupyter usw.).
Geben Sie ihnen Informationen und nicht nur interne Implementierungsdetails.
anstatt:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
schreiben:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
oder vielleicht sogar:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Ich weiß, ich weiß - dies ist kein Fall für eine statische Behauptung, aber ich möchte auf den Informationswert der Nachricht verweisen.
Negative oder positive Nachricht?
Das mag umstritten sein, aber es tut mir weh, Dinge zu lesen wie:
assert a == b, 'a is not equal to b'
Dies sind zwei widersprüchliche Dinge, die nebeneinander geschrieben sind. Wenn ich also Einfluss auf die Codebasis habe, dränge ich darauf, anzugeben, was wir wollen, indem ich zusätzliche Verben wie "muss" und "sollte" verwende und nicht sage, was wir nicht wollen.
behaupten a == b, 'a muss gleich b sein'
Dann ist das Abrufen AssertionError: a must be equal to b
auch lesbar, und die Anweisung sieht im Code logisch aus. Sie können auch etwas daraus machen, ohne den Traceback zu lesen (der manchmal nicht einmal verfügbar ist).