Voici une autre option qui ne présente pas les problèmes de mots-clés mentionnés dans la réponse de Dunes. Elle ne peut traiter que les mots-clés positionnels ( {0}
) et non des mots-clés ( {foo}
). Elle ne nécessite pas non plus deux appels au format (en utilisant le trait de soulignement). Il possède le facteur de sécurité de la sous-classification de 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', "%") == "{": # optional
msg = BraceString(msg)
return msg, kwargs
Vous l'utilisez comme ça :
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Bien sûr, vous pouvez supprimer le contrôle noté avec # optional
pour forcer tous les messages passant par l'adaptateur à utiliser le nouveau style de formatage.
Note pour ceux qui lisent cette réponse des années plus tard : En commençant par Python 3.2 vous pouvez utiliser le paramètre de style con Formatter
objets :
La journalisation (à partir de la version 3.2) offre un support amélioré pour ces deux styles de formatage supplémentaires. La classe Formatter a été améliorée pour prendre un paramètre supplémentaire, facultatif, nommé "mot-clé". style
. Ce site par défaut '%'
mais d'autres valeurs possibles sont '{'
y '$'
qui correspondent à th styles de mise en forme. La rétrocompatibilité est maintenue par défaut (comme on pourrait s'y attendre), mais par spécifiant explicitement un paramètre de style, vous avez la possibilité de spécifier des chaînes de formatage qui fonctionnent avec str.format()
o string.Template
.
La documentation fournit l'exemple suivant logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Notez que dans ce cas, vous ne pouvez toujours pas appeler la fonction logger
avec le nouveau format. Par exemple, ce qui suit ne fonctionnera toujours pas :
logger.info("knights:{say}", say="ni") # Doesn't work!
logger.info("knights:{0}", "ni") # Doesn't work either