Aquí hay otra opción que no tiene los problemas de palabras clave mencionados en la respuesta de Dunes. Solo puede manejar {0}
argumentos posicionales ( ) y no argumentos de palabra clave ( {foo}
). Tampoco requiere dos llamadas para formatear (usando el guión bajo). Tiene el factor ick de subclasificar 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 usas así:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Por supuesto, puede eliminar la marca de verificación indicada con # optional
para forzar que todos los mensajes a través del adaptador utilicen un formato de nuevo estilo.
Nota para cualquiera que lea esta respuesta años después : a partir de Python 3.2 , puede usar el parámetro de estilo con Formatter
objetos:
El registro (a partir de la versión 3.2) proporciona un soporte mejorado para estos dos estilos de formato adicionales. La clase Formatter se ha mejorado para tomar un parámetro de palabra clave opcional adicional llamado style
. Este valor predeterminado es '%'
, pero otros valores posibles son '{'
y '$'
, que corresponden a los otros dos estilos de formato. La compatibilidad con versiones anteriores se mantiene de forma predeterminada (como era de esperar), pero al especificar explícitamente un parámetro de estilo, tiene la capacidad de especificar cadenas de formato que funcionan con str.format()
o
string.Template
.
Los documentos proporcionan el ejemplo
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Tenga en cuenta que en este caso aún no puede llamar al logger
con el nuevo formato. Es decir, lo siguiente todavía no funcionará:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)