Ecco un'altra opzione che non presenta i problemi di parole chiave menzionati nella risposta di Dunes. Può gestire solo {0}argomenti positional ( ) e non argomenti keyword ( {foo}). Inoltre non richiede due chiamate per formattare (utilizzando il trattino basso). Ha il fattore ick della sottoclasse str:
class BraceString(str):
def __mod__(self, other):
return self.format(*other)
def __str__(self):
return self
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(StyleAdapter, self).__init__(logger, extra)
def process(self, msg, kwargs):
if kwargs.pop('style', "%") == "{":
msg = BraceString(msg)
return msg, kwargs
Lo usi in questo modo:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Ovviamente, puoi rimuovere il segno di spunta con # optionalper forzare tutti i messaggi attraverso l'adattatore a utilizzare la formattazione del nuovo stile.
Nota per chiunque legga questa risposta anni dopo : a partire da Python 3.2 , puoi utilizzare il parametro style con gli Formatteroggetti:
La registrazione (a partire dalla versione 3.2) fornisce un supporto migliorato per questi due stili di formattazione aggiuntivi. La classe Formatter è stata migliorata per accettare un parametro di parola chiave opzionale aggiuntivo denominato style. L'impostazione predefinita è '%', ma altri valori possibili sono '{'e '$', che corrispondono agli altri due stili di formattazione. La compatibilità con le versioni precedenti viene mantenuta per impostazione predefinita (come ci si aspetterebbe), ma specificando esplicitamente un parametro di stile, si ha la possibilità di specificare stringhe di formato che funzionano con str.format()o
string.Template.
I documenti forniscono l'esempio
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Nota che in questo caso non puoi ancora chiamare il loggercon il nuovo formato. Cioè, quanto segue ancora non funzionerà:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)