Ось ще один варіант, який не має проблем із ключовими словами, згаданих у відповіді Dunes. Він може обробляти лише позиційні ( {0}
) аргументи, а не аргументи ключових слів ( {foo}
). Також не потрібно два виклики для форматування (з використанням символу підкреслення). Він має коефіцієнт ick для підкласифікації 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
Ви використовуєте його так:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Звичайно, ви можете видалити позначку, позначену, # optional
щоб змусити всі повідомлення через адаптер використовувати форматування нового стилю.
Примітка для тих, хто читає цю відповідь роками пізніше : Починаючи з Python 3.2 , ви можете використовувати параметр style із Formatter
об’єктами:
Ведення журналу (станом на 3.2) забезпечує покращену підтримку цих двох додаткових стилів форматування. Клас Formatter був вдосконалений, щоб взяти додатковий, необов’язковий параметр ключового слова з іменем style
. Це значення за замовчуванням '%'
, але інші можливі значення '{'
і '$'
, які відповідають двом іншим стилям форматування. Зворотна сумісність підтримується за замовчуванням (як і слід було очікувати), але, явно вказавши параметр стилю, ви отримуєте можливість вказувати рядки форматування, які працюють з str.format()
або
string.Template
.
Документи наводять приклад
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Зверніть увагу, що в цьому випадку ви все одно не можете зателефонувати logger
за новим форматом. Тобто, наступне все одно не буде працювати:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)