Oto kolejna opcja, która nie ma problemów ze słowami kluczowymi wymienionymi w odpowiedzi Dunes. Obsługuje tylko {0}
argumenty pozycyjne ( ), a nie argumenty słów kluczowych ( {foo}
). Nie wymaga również dwóch wywołań formatowania (przy użyciu podkreślenia). Ma ten współczynnik podklasy 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
Używasz tego w ten sposób:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Oczywiście można usunąć zaznaczenie oznaczone ikoną, # optional
aby wymusić na wszystkich komunikatach przechodzących przez adapter użycie nowego stylu formatowania.
Uwaga dla każdego, kto po latach przeczyta tę odpowiedź : Począwszy od Pythona 3.2 , można używać parametru style z Formatter
obiektami:
Rejestrowanie (od 3.2) zapewnia ulepszoną obsługę tych dwóch dodatkowych stylów formatowania. Klasa Formatter została rozszerzona o dodatkowy, opcjonalny parametr słowa kluczowego o nazwie style
. Domyślnie jest to '%'
, ale inne możliwe wartości to '{'
i '$'
, które odpowiadają dwóm pozostałym stylom formatowania. Zgodność wsteczna jest utrzymywana domyślnie (zgodnie z oczekiwaniami), ale poprzez jawne określenie parametru stylu uzyskuje się możliwość określenia ciągów formatu, które działają z str.format()
lub
string.Template
.
Dokumentacja dostarcza przykładu
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Zauważ, że w tym przypadku nadal nie możesz zadzwonić logger
do nowego formatu. To znaczy, że nadal nie będzie działać:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)