Ich betreibe Python 2.4 in einer Game Engine und möchte bei Bedarf alle Drucke ausschalten können. Zum Beispiel möchte ich die Drucke für einen Debug-Build haben und dann für einen Release-Build deaktiviert. Es ist auch wichtig, dass es so transparent wie möglich ist.
Meine Lösung dazu im C-Code der Engine ist die printf
-Funktion innerhalb eines vararg
-Makros zu haben und das zu definieren, um in einem Release-Build nichts zu tun.
Das ist meine aktuelle Lösung:
%Vor%Es erleichtert das Umschalten von Ausdrucken, aber es gibt möglicherweise eine bessere Möglichkeit, die Zeichenfolge zu formatieren. Mein Hauptproblem ist, dass dies tatsächlich eine Menge mehr Funktionsaufrufe zum Programm hinzufügt.
Ich frage mich, ob Sie irgendetwas dafür tun können, wie das Schlüsselwort print funktioniert?
Ja, Sie können sys.stdout
zuweisen, was immer Sie wollen. Erstellen Sie eine kleine Klasse mit einer write
-Methode, die nichts bewirkt:
Mit der gleichen Technik können Sie Ihre Ausdrucke auch in einer Datei protokollieren lassen, indem Sie sys.stdout
auf ein geöffnetes Dateiobjekt setzen.
Ich weiß, dass eine Antwort bereits als richtig markiert wurde, aber Python hat ein Debug-Flag, das eine sauberere Lösung bietet. Du benutzt es so:
%Vor% Wenn Sie Python mit -O oder -OO aufrufen (wie Sie es normalerweise für einen Release-Build tun würden), wird __debug__
auf False
gesetzt. Noch besser ist, dass __debug__
ein Sonderfall für den Interpreter ist; Es wird diesen Code tatsächlich entfernen, wenn er die pyc/pyo
-Dateien schreibt, wodurch der resultierende Code kleiner / schneller wird. Beachten Sie, dass Sie __debug__
keine Werte zuweisen können. Daher basiert es vollständig auf diesen Befehlszeilenargumenten.
Das Logging-Modul ist der "beste" Weg .. obwohl ich oft einfach etwas einfaches benutze. .
%Vor%Verwenden Sie nicht print, sondern erstellen Sie eine Konsolenklasse, die alle Druckvorgänge abwickelt. Rufen Sie einfach die Konsole an und die Konsole kann entscheiden, ob sie tatsächlich gedruckt werden soll oder nicht. Eine Konsolenklasse ist auch nützlich für Dinge wie Fehler- und Warnmeldungen oder umleiten wo die Ausgabe geht.
Wenn Sie wirklich den Druck umschalten möchten:
%Vor% Ich empfehle jedoch, dass Sie nur print
für den Wegwerfcode verwenden. Verwende logging
für echte Apps wie die ursprüngliche Frage beschreibt. Es ermöglicht eine gleitende Skala von Ausführlichkeit, so dass Sie nur die wichtige Protokollierung oder ausführlichere Protokollierung von normalerweise weniger wichtigen Details haben können.
Zum Beispiel könnte es sinnvoll sein, Debugging-Logs in Ihren Code einzufügen. Dann, um sie zum Schweigen zu bringen, ändern Sie Ihr Level auf eine höhere Stufe, eine von INFO
, WARN
oder WARNING
, ERROR
oder CRITICAL
oder FATAL
In einem Skript sollten Sie dies einfach in basicConfig
wie folgt festlegen:
Eine genauere Verwendung der Protokollierung finden Sie in den Dokumenten .
Ich habe diese Frage auf einem anderer Beitrag wurde aber die Frage als doppelt markiert:
Wie auch immer, hier ist, was ich tun würde:
%Vor% Leider können Sie die py2-Drucksyntax print 'foo'