Указание ширины сцепленных переменных в f-строке

#python #f-string

#python #f-строка

Вопрос:

Я использую пакет loguru для входа в мой проект python.

https://github.com/Delgan/loguru

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

Вот формат по умолчанию …

 '<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>'
 

Результат выглядит примерно так…

 2020-12-28 14:36:27.510 | INFO     | package1.module1:function:132 - Listing Users...
2020-12-28 14:36:27.601 | ERROR    | package10.module10:function10:1000 - The provided token has expired
 

Я хочу добавить статическую ширину / заполнение в пакет / модуль / функцию, чтобы результат выглядел так…

 2020-12-28 14:36:27.510 | INFO     | package1.module1:function:132      - Listing Users...
2020-12-28 14:36:27.601 | ERROR    | package10.module10:function10:1000 - The provided token has expired
 

Проблема в том, что полный путь с номером строки функции состоит из 3 переменных …

 <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan>
 

Могу ли я каким-либо образом указать ширину для комбинации строк? Что-то вроде …

 <cyan>{name   ":"   function   ":"   line : 45}</cyan>
 

Ценю помощь!

Комментарии:

1. {level: <8} Часть делает это; вы можете сделать {name ":" function ":" line: <45} точно так же.

Ответ №1:

Вы всегда можете ограничить длину строки, точно так же, как вы бы поступили с любым sequence :

 # 150 chars string:
x = "abc" * 50

# 30 chars string:
y = "xyz" * 10

# predefined display limit:
n = 45

spaces = " " * n
print(f"{(x spaces)[:n]} end line")
print(f"{(y spaces)[:n]} end line")
print(f"{(y x spaces)[:n]} end line")
 

Выводит:

 abcabcabcabcabcabcabcabcabcabcabcabcabcabcabc end line
xyzxyzxyzxyzxyzxyzxyzxyzxyzxyz                end line
xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzabcabcabcabcabc end line
 

Комментарии:

1. Спасибо за ваш ответ, к сожалению, это не выравнивает строку справа от ‘x’ и ‘y’. Желаемый результат будет выровнен по «конечной строке»

2. @TylerWeiss — посмотрите сейчас — это должно сработать (возможно, вы захотите упаковать все это в функцию для ясности кода)