Выравнивание форматирования YAML в журнале Python с конкатенацией буквенных строк
Я пытаюсь настроить мой формат регистрации в приложении Python 3, используя формат конфигурации YAML. Однако я не смог отформатировать его так, как хотел.
Формат использует интерполяцию f-строки для интерпретации значений из регистратора. Я хочу добавить буквальную строку к этому интерпретированному значению, а затем выровнять и дополнить все это.
Это мой текущий конфиг:
formatters:
complex:
format: '{asctime} {name:<16} [{levelname:^9}] {funcName:16} {message}'
datefmt: "%d/%m/%Y %H:%M:%S"
style: '{'
Что я хочу сделать, это добавить строку ():
в funcName, так что результат будет, например.
<somestuff> myfunction(): <somemessage>
YAML позволяет мне использовать {funcName:16}():
но это приводит к
myFunction (): <somemessage>
Мне удалось найти способ использования вложенных f-строк при использовании простой функции печати в случайном файле.py
funcName = "myFunction"
print(f"<somestuff> {'f{funcName}():':16} <somemessage>")
Это правильно печатает сообщение
<somestuff> myfunction(): <somemessage>
Но изменение форматирования YAML на то же самое дает мне кучу ошибок и не работает.
'{asctime} {name:<16} [{levelname:^9}] {"f{funcName}():":16} {message}'
Я также пытался избежать символов (): помещая их в двойные фигурные скобки в соответствии со спецификацией f-строки, но это также приводило к ошибкам.
Есть ли способ присоединить строковый литерал к интерпретируемой строке?
РЕДАКТИРОВАТЬ: ошибка дана ValueError: unexpected '{' in field name
1 ответ
Здесь нет field name
(или даже field
) в источнике PyYAML, поэтому ValueError не исходит из неверного источника YAML. В любом случае PyYAML выдает более опознаваемую ошибку.
Если вы делаете:
print("<somestuff> {'f{funcName}():':16} <somemessage>".format())
Вы получаете ошибку:
ValueError: unexpected '{' in field name
И это то, что пытается сделать модуль регистрации. Он не интерпретирует эту строку как f-строку, он использует format()
внутри строки, с соответствующими аргументами.