Aqui está outra opção que não possui os problemas de palavra-chave mencionados na resposta de Dunes. Ele pode lidar apenas com {0}
argumentos posicionais ( ) e não com argumentos de palavra-chave ( {foo}
). Também não requer duas chamadas para formatar (usando o sublinhado). Ele tem o fator ick de subclasse 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
Você o usa assim:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Obviamente, você pode remover a marca de verificação com # optional
para forçar todas as mensagens através do adaptador a usar a formatação de novo estilo.
Observação para quem ler esta resposta anos depois : a partir do Python 3.2 , você pode usar o parâmetro style com Formatter
objetos:
O registro (a partir de 3.2) fornece suporte aprimorado para esses dois estilos de formatação adicionais. A classe Formatter foi aprimorada para receber um parâmetro de palavra-chave opcional adicional chamado style
. O padrão é '%'
, mas outros valores possíveis são '{'
e '$'
, que correspondem aos outros dois estilos de formatação. A compatibilidade com versões anteriores é mantida por padrão (como você esperaria), mas ao especificar explicitamente um parâmetro de estilo, você obtém a capacidade de especificar strings de formato que funcionam com str.format()
ou
string.Template
.
Os documentos fornecem o exemplo
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Observe que, neste caso, você ainda não pode chamar o logger
com o novo formato. Ou seja, o seguinte ainda não funcionará:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)