[Python] Stop using print for debugging

enrico franchi enrico.franchi a gmail.com
Mar 23 Giu 2015 18:48:23 CEST


2015-06-23 7:41 GMT+01:00 Simone Federici <s.federici a gmail.com>:

> altro suggerento per loggare elementi costosi a livello computazionale
> tipo json.dumps() è wrapparli con isEnabledFor
>
> if logger.isEnabledFor(logging.DEBUG):
>     logger.debug('dump: %s', json.dumps())
>

Un'altra possibilita' in questi casi (che a me piace di piu') ma che ha un
minimo costo (di sviluppo) ma lascia il codice piu' pulito e mantiene
l'efficienza a livello di codice marginalmente migliore e' introdurre dei
proxy.

Ovvero qualcosa come:

class JSONDumper(object):
    def __init__(self, obj):
        self.obj = obj

    def __str__(self):
        return json.dumps(self.obj)

e poi semplicemente:

logger.debug('dump: %s', JSONDumper(something))


Di fatto debug/info e compagnia hanno gia' dentro la logica per costruire
la stringa dai placeholder se e solo se la stringa viene attualmente
stampata su qualcosa (quindi il livello di logging e' giusto etc etc etc).
Un oggetto come quello che ho scritto di fatto si appoggia a questa logica.

Di fatto, puoi immaginare che logger.debug dentro abbia gia' un controllo
come logger.isEnabledFor(logging.DEBUG) e quindi, in pratica, lo staresti
chiamando due volte. Teoricamente hai anche potenzialmente il caso in cui
il logging level cambi fra le due chiamate, per quanto raro.

Dopo di che, ci sono una serie di casi in cui fare un proxy tipo quello la
sopra e' un overkill e la soluzione che suggerisci funziona bene per tutti
gli scopi pratici.


-- 
.
..: -enrico-
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20150623/e6e47a48/attachment.html>


Maggiori informazioni sulla lista Python