2012-11-12 14 views
23

In C schreiben wir Code wiePython Äquivalent für #ifdef DEBUG

#ifdef DEBUG 
printf("Some debug log... This could probably be achieved by python logging.Logger"); 
/* Do some sanity check code */ 
assert someCondition 
/* More complex sanitycheck */ 
while(list->next){ 
assert fooCheck(list) 
} 

#endif 

Gibt es eine Möglichkeit, dies in Python zu tun?

Bearbeiten: Ich habe meine Antwort und mehr :) Paolo, Steven Rumbalski und J Sebastian gab mir die Informationen, die ich suchte. Danke das für die ausführliche Antwort, obwohl ich im Moment wahrscheinlich keinen Präprozessor verwenden werde.

J Sebastian, dessen Kommentar gelöscht wurde, weil die Antwort, in der er seinen Kommentar gepostet hat, seine Antwort gelöscht hat, denke ich. Er sagte, ich könnte die IsEnabledFor() -Methode in Logger verwenden, um eine Bedingung zu füttern.

Vielen Dank für Ihre Eingaben. Das ist meine erste Frage. Ich wünschte, ich könnte Paolo oder J Sebastians Antworten akzeptieren. Aber da diese als Kommentare angeboten wurden, akzeptiere ich die Antwort.

Ich werde wahrscheinlich entweder http://nestedinfiniteloops.wordpress.com/2012/01/15/if-debug-python-flavoured/ oder Logger.isEnabledFor verwenden()

+2

http://stackoverflow.com/questions/1593274/how-do-i-check-if-the-python-debug-option-is-set-from-within-a-script und http: // nestedinfiniteloops .wordpress.com/2012/01/15/if-debug-python-aromated/ –

+4

Was ist los mit einem globalen 'DEBUG' und einem einfachen if-statement' wenn DEBUG: ... '? –

Antwort

6

Was Sie suchen ist ein Präprozessor für Python. Im Allgemeinen haben Sie drei Möglichkeiten:

  1. schreiben Eigenbau Skript/Programm, die auf bestimmte Vorlagen, bevor er das Ergebnis auf dem Interpreter basiert Teile des Sourcecode ersetzt (möglicherweise schwer)
  2. Verwenden Sie einen speziellen Zweck python Präprozessor wie pppp - Poor's Python Pre-Processor
  3. Verwenden Sie ein Allzweck-Präprozessor wie GPP

ich pppp empfehlen daher, zuerst;)

Der Hauptvorteil eines Präprozessors im Vergleich zum Setzen eines DEBUG Flags und des laufenden Codes if (DEBUG == True) ist, dass bedingte Prüfungen auch CPU-Zyklen kosten. Daher ist es besser, Code zu entfernen, der nicht ausgeführt werden muss (wenn der Python-Interpreter dies nicht tut) mach das trotzdem), anstatt es zu überspringen.

+1

cog.py ist ein weiterer netter Preprocesor (wo die Präprozessorsprache selbst Python ist): http://nedbatchelder.com/code/cog/ –

+0

Es sieht aus wie der Link zu pppp - Poor's Python Pre-Processor ist oben tot. Hier ist ein Link zum Code auf [github] (https://github.com/pinard/Pymacs/blob/master/pppp.rst.in) – user2070305

+0

Für den einfachen Fall von '#ifdef DEBUG',' wenn__debug__' ist völlig ausreichend und verursacht ** keine Laufzeitkosten **. Siehe https://StackOverflow.com/a/45821863/1752050 – doctaphred

39

Verwenden __debug__ im Code:

if __debug__: 
    print 'Debug ON' 
else: 
    print 'Debug OFF' 

ein Skript abc.py mit dem obigen Code erstellen und dann

  1. Run mit python -O abc.py
  2. Run mit python abc.py

Beachten Sie die Unterschied.

+0

Tatsächlich entfernt Python die 'if'-Anweisung vollständig, wenn der Ausdruck ein statischer Wert ist (zB 'True',' False', 'None',' __debug__ ',' 0' und '0.0'), was' if__debug__' zu einer Kompilierzeitrichtlinie anstatt einer Laufzeitprüfung macht. (BEARBEITEN: anscheinend kann nicht Code-Blöcke in den Kommentaren enthalten; rate ich werde eine andere Antwort hinzufügen) – doctaphred

4

Mohammad's answer ist der richtige Ansatz: Verwenden Sie if __debug__.

Tatsächlich entfernt Python vollständig die if Anweisung, wenn der Ausdruck eine statische Konstante (wie True, False, None, __debug__, 0 und 0.0) ist, so dass if __debug__ eine Compiler-Direktive eher als eine Laufzeitprüfung:

>>> def test(): 
...  if __debug__: 
...   return 'debug' 
...  return 'not debug' 
... 
>>> import dis 
>>> dis.dis(test) 
    3   0 LOAD_CONST    1 ('debug') 
       2 RETURN_VALUE 

ich kann nicht finden, wo dies ausdrücklich in der Dokumentation angegeben, obwohl es eine ähnliche Optimierung für assert statements erwähnt.

Verwenden Sie also keinen externen Präprozessor - für diesen Zweck haben Sie einen eingebauten!

+0

Gab +1 für die Antwort :) –