Как обрамить кавычками значение без отступов при интерполяции строк в python?

Рейтинг: 0Ответов: 1Опубликовано: 31.05.2023

Следующий шаблон:

'module: "{module:10s}"; file: "{filename:10s}"; line: "{lineno:3d}"; msg: "{message}";'

Соответствует строке:

module: "views     "; file: "views.py  "; line: " 62"; msg: "text";

Какой шаблон с отступами соответствует строке(?):

module: "views";      file: "views.py";   line: "62";  msg: "text";

Ответы

▲ 2Принят

Средствами форматирования/интерполяции то что вы хотите нормально вряд ли получится сделать. Я бы просто пробелы после точек с запятой заменил на табы, потом уже к отформатированной строке применял метод строки expandtabs:

format_string = 'module: "{module}";\tfile: "{filename}";\tline: "{lineno}";\tmsg: "{message}";'

module = "views"
filename = "views.py"
lineno = 62
message = "text"

formatted = format_string.format(module=module, filename=filename, lineno=lineno, message=message)
print(formatted)  # вывод с табами, результат зависит от настроек размера табуляции терминала / редактора и т.д.
print(formatted.expandtabs())  # по умолчанию tab заменяется выравниванием под 8 символов
print(formatted.expandtabs(32))  # выравнивание под 32 символа

Примерный вывод:

module: "views";    file: "views.py";   line: "62"; msg: "text";
module: "views";        file: "views.py";       line: "62";     msg: "text";
module: "views";                file: "views.py";               line: "62";                     msg: "text";

Выравнивание под N символов означает, что кусок после символа табуляции будет выровнен под ближайшую позицию от начала строки, кратную N.

Например для таба размером 8:

module: "views";        file: "views.py";       line: "62";     msg: "text";
                 ^14    ^32               ^42   ^48         ^60 ^64

Первый маркер в каждой паре - позиция, на которой могла продолжиться строка при табе = 1 пробелу, видно что каждый раз число не кратно 8. Второй маркер - позиция строки после "развертки" табов, строка становится сдвинута так, чтобы позиция стала кратной 8.