2012-11-12 18 views
23

In C si scrivere codice comePython equivalente per #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 

C'è un modo per fare questo in Python?

Modifica: ho avuto la mia risposta, e altro :) Paolo, Steven Rumbalski e J Sebastian mi hanno dato le informazioni che stavo cercando. Grazie per la risposta dettagliata, anche se probabilmente non userò un preprocessore al momento.

J Sebastian, il cui commento è stato cancellato perché la risposta in cui ha pubblicato il suo commento, ha cancellato la sua risposta, penso. Ha detto che potrei usare il metodo isEnabledFor() in Logger per alimentare un condizionale.

Grazie a tutti per i vostri input. Questa è la mia prima domanda. Vorrei poter accettare paolo o le risposte di Sebastian. Ma dal momento che sono stati offerti come commenti, accetterò la risposta di das.

io probabilmente utilizzare http://nestedinfiniteloops.wordpress.com/2012/01/15/if-debug-python-flavoured/ o Logger.isEnabledFor()

+2

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

+4

Cosa c'è che non va nell'impostare un DEBUG globale e usare un semplice if-statment 'se DEBUG: ...'? –

risposta

6

Quello che state cercando è un preprocessore per Python. In genere si hanno tre opzioni: (può essere difficile)

  • Utilizzare uno scopo speciale

    1. Scrivi una sceneggiatura selfmade/programma che sostituisce le parti del codice sorgente in base a determinati modelli prima di passare il risultato sul all'interprete pitone preprocessore come pppp - Poor's Python Pre-Processor
    2. Utilizzare uno scopo preprocessore generale come GPP

    Vi consiglio di provare prima pppp;)

    Il vantaggio principale di un preprocessore rispetto all'impostazione di un flag if (DEBUG == True)if (DEBUG == True) è che i controlli condizionali costano anche i cicli della CPU, quindi è meglio rimuovere il codice che non è necessario eseguire (se l'interprete python non fallo comunque), invece di saltarlo.

  • +1

    cog.py è un altro ottimo preprocessore (dove il linguaggio del preprocessore è Python): http://nedbatchelder.com/code/cog/ –

    +0

    Sembra il collegamento a pppp - Il Pre-processore Python di cui sopra è morto. Ecco un link al codice su [github] (https://github.com/pinard/Pymacs/blob/master/pppp.rst.in) – user2070305

    +0

    Per il semplice caso di '#ifdef DEBUG',' se __debug__' è totalmente sufficiente, e comporta ** nessun costo di runtime **. Vedi https://stackoverflow.com/a/45821863/1752050 – doctaphred

    39

    Uso __debug__ nel codice:

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

    creare uno script abc.py con il codice di cui sopra e poi

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

    osservare la differenza.

    +0

    In effetti, Python rimuove completamente l'istruzione 'if' se l'espressione è un valore statico (come' True', 'False',' None', '__debug__ ',' 0' e '0.0'), rendendo' if __debug__' una direttiva in fase di compilazione piuttosto che un controllo di runtime. (EDIT: apparentemente non è possibile includere blocchi di codice nei commenti, suppongo aggiungerò un'altra risposta) – doctaphred

    4

    Mohammad's answer è l'approccio giusto: utilizzare if __debug__.

    In realtà, Python rimuove completamente la dichiarazione if se l'espressione è una costante statica (come True, False, None, __debug__, 0, e 0.0), rendendo if __debug__ una direttiva in fase di compilazione, piuttosto che un controllo di runtime:

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

    non riesco a trovare ove esplicitamente indicato nella documentazione, anche se si parla di un'ottimizzazione simile per assert statements.

    Quindi non utilizzare un preprocessore esterno: per questo scopo, ne è stato incorporato uno!

    +0

    Hai dato +1 per la risposta :) –