Gut, dies ist eine offene Frage, und ich möchte zwei Aspekte ansprechen: wann Assertions hinzuzufügen sind und wie man die Fehlermeldungen schreibt.
Zweck
Um es einem Anfänger zu erklären - Assertions sind Aussagen, die Fehler auslösen können, die jedoch nicht abgefangen werden. Und sie sollten normalerweise nicht ausgelöst werden, aber im wirklichen Leben passiert es manchmal trotzdem. Und dies ist eine ernste Situation, aus der der Code nicht wiederherstellen kann, was wir einen 'fatalen Fehler' nennen.
Als nächstes dienen sie 'zum Debuggen', was zwar korrekt ist, aber sehr herablassend klingt. Ich mag die Formulierung 'deklarieren von Invarianten, die niemals verletzt werden sollen' besser, obwohl sie bei verschiedenen Anfängern unterschiedlich funktioniert... Manche 'kapieren es einfach', und andere finden entweder keinen Nutzen dafür, ersetzen normale Ausnahmen oder sogar den Kontrollfluss damit.
Stil
In Python ist assert
eine Anweisung, keine Funktion! (bedenke, dass assert(False, 'ist wahr')
nicht ausgelöst wird. Aber, um das aus dem Weg zu räumen:
Wann und wie sollte die optionale 'Fehlermeldung' geschrieben werden?
Dies gilt tatsächlich für Unit-Test-Frameworks, die oft viele dedizierte Methoden für Assertions haben (assertTrue(Bedingung)
, assertFalse(Bedingung), assertEqual(aktuell, erwartet)
usw.). Sie bieten oft auch eine Möglichkeit, die Assertion zu kommentieren.
In Wegwerfcode könnten Sie ohne die Fehlermeldungen auskommen.
In einigen Fällen gibt es nichts zur Assertion hinzuzufügen:
def dump(etwas): assert isinstance(etwas, Dumpable) # ...
Aber 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 etc.).
Geben Sie ihnen Informationen, nicht nur interne Implementierungsdetails preis.
anstatt:
assert bedeutungsloser_identifier <= MAGIC_NUMBER_XXX, 'bedeutungsloser_identifier ist größer als MAGIC_NUMBER_XXX!!!'
schreiben Sie:
assert bedeutungsloser_identifier > MAGIC_NUMBER_XXX, 'Reaktortemperatur über kritischem Schwellenwert'
oder vielleicht sogar:
assert bedeutungsloser_identifier > MAGIC_NUMBER_XXX, f'Reaktortemperatur({bedeutungsloser_identifier }) über kritischem Schwellenwert ({MAGIC_NUMBER_XXX})'
Ich weiß, ich weiß - das ist kein Fall für eine statische Assertion, aber ich möchte auf den Informationswert der Nachricht hinweisen.
Negative oder positive Nachricht?
Dies mag umstritten sein, aber es tut mir weh, Dinge wie zu lesen:
assert a == b, 'a ist nicht gleich b'
-
dies sind zwei widersprüchliche Dinge, die nebeneinander geschrieben sind. Also wann immer ich Einfluss auf den Code habe, dränge ich darauf zu spezifizieren, was wir wollen, indem ich zusätzliche Verben wie 'muss' und 'sollte' verwende, und nicht zu sagen, was wir nicht wollen.
assert a == b, 'a muss gleich b sein'
Dann ist AssertionError: a muss gleich b sein
auch lesbar, und die Aussage sieht logisch im Code aus. Außerdem kann man daraus etwas ableiten, ohne den Traceback lesen zu müssen (der manchmal nicht einmal verfügbar ist).
66 Stimmen
-O und -OO Python-Parameter werden Ihre Behauptungen beseitigen. Das sollte Ihr Denken darüber anregen, wofür es gut ist.
6 Stimmen
Der Link von Thomasz Zielinski ist defekt, er lautet nun: mail.python.org/pipermail/python-list/2013-November/660568.html . Ich bin mir ziemlich sicher, dass pipermail eine instabile ID-Funktion hat. Ich habe andere Links innerhalb desselben pipermail gefunden, die auf dieselbe URL mit derselben Absicht verweisen.
9 Stimmen
Im Falle, dass mail.python.org/pipermail/python-list/2013-November/660568.html erneut verschoben wird, ist es archiviert unter archive.is/5GfiG. Der Titel des Beitrags lautet "When to use assert" und ist ein ausgezeichneter Beitrag (eigentlich ein Artikel) zu den bewährten Methoden für Python
assert
.0 Stimmen
Beantwortet das deine Frage? Was ist die Verwendung von "assert" in Python?
3 Stimmen
Ich sehe nie Leute in der Praxis Python-Skripte mit "-O" oder "-OO" ausführen.