Ich habe in letzter Zeit viel in Python programmiert. Und ich habe mit Daten gearbeitet, mit denen ich noch nie gearbeitet habe, mit noch nie dagewesenen Formeln und mit riesigen Dateien. All dies hat mich dazu gebracht, viele Druckanweisungen zu schreiben, um zu überprüfen, ob alles richtig läuft, und um die Fehlerquellen zu identifizieren. Im Allgemeinen ist es jedoch keine gute Praxis, so viele Informationen auszugeben. Wie verwende ich die print-Anweisungen nur, wenn ich debuggen möchte, und lasse sie überspringen, wenn ich nicht möchte, dass sie gedruckt werden?
109
level
imbasicConfig
Anruf auflogging.ERROR
.logging.basicConfig(stream=sys.stderr, level=logging.ERROR)
hat keine Auswirkung. Das Neustarten des Kernels und das Festlegen der neuen Ebene funktioniert, aber das ist eine Problemumgehung für mich.Eine einfache Möglichkeit, dies zu tun, besteht darin, eine Protokollierungsfunktion aufzurufen:
Anschließend können Sie den Wert von ändern
DEBUG
und Ihren Code mit oder ohne Protokollierung ausführen.Das Standardmodul
logging
verfügt hierfür über einen ausgefeilteren Mechanismus.quelle
logging
funktioniert (auf einer sehr einfachen Ebene).Verwenden Sie das integrierte Protokollierungsbibliotheksmodul , anstatt zu drucken.
Sie erstellen ein
Logger
Objekt (z. B.logger
) und geben danach jedes Mal, wenn Sie einen Debug-Druck einfügen, Folgendes ein:Sie können
logger.setLevel
zu Beginn des Programms den Ausgangspegel einstellen. Wenn Sie DEBUG einstellen, werden alle Debugs gedruckt. Wenn Sie INFO oder höher einstellen, werden alle Debugs sofort ausgeblendet.Sie können es auch verwenden, um schwerwiegendere Dinge auf verschiedenen Ebenen (INFO, WARNING und ERROR) zu protokollieren.
quelle
Zunächst werde ich die Nominierung des Python- Protokollierungsframeworks unterstützen . Seien Sie jedoch ein wenig vorsichtig, wie Sie es verwenden. Insbesondere: Lassen Sie das Protokollierungsframework Ihre Variablen erweitern, und tun Sie es nicht selbst. Zum Beispiel anstelle von:
Stellen Sie sicher, dass Sie Folgendes tun:
Denn während sie ähnlich aussehen, verursacht die erste Version die repr () - Kosten, selbst wenn sie deaktiviert ist . Die zweite Version vermeidet dies. In ähnlicher Weise würde ich, wenn Sie Ihre eigenen rollen, etwas vorschlagen wie:
angerufen über:
Dies vermeidet wiederum den Overhead, wenn Sie ihn deaktivieren, indem Sie Folgendes tun:
Der Aufwand für die Berechnung dieser Zeichenfolgen spielt wahrscheinlich keine Rolle, es sei denn, sie sind entweder 1) teuer in der Berechnung oder 2) die Debug-Anweisung befindet sich beispielsweise in der Mitte einer n ^ 3-Schleife oder so. Nicht, dass ich etwas darüber wissen würde.
quelle
Ich weiß nichts über andere, aber ich wurde verwendet, um eine "globale Konstante" (
DEBUG
) und dann eine globale Funktion (debug(msg)
) zu definieren, diemsg
nur gedruckt wird , wennDEBUG == True
.Dann schreibe ich meine Debug-Anweisungen wie folgt:
... dann nehme ich Unit-Tests auf und habe das nie wieder gemacht! :) :)
quelle
print()
, bis ich meinen Code auf das erforderliche Niveau gebracht habe, um den Test zu bestehen. Ich habe nie eine große Menge vonprint()
überall. Protokollierung ist auch cool! :)