Как передать формат строки как переменную в f-строку

Я использую f-строки, и мне нужно определить формат, который зависит от переменной.

def display_pattern(n):
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:>3}' + temp
        print(temp)

Если это уместно, вывод display_pattern(5) является:

  1
  2  1
  3  2  1
  4  3  2  1
  5  4  3  2  1

Интересно, можно ли манипулировать форматом? >3и вместо этого передайте переменную. Например, я попробовал следующее:

def display_pattern(n):
    spacing = 4
    format_string = f'>{spacing}' # this is '>4'
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:format_string}' + temp
        print(temp)

Однако я получаю следующую ошибку:

Traceback (most recent call last):
  File "pyramid.py", line 15, in <module>
    display_pattern(8)
  File "pyramid.py", line 9, in display_pattern
    temp = f'{i:format_string}' + temp
ValueError: Invalid format specifier

Есть ли способ заставить этот код работать? Основным моментом является возможность контролировать интервал, используя переменную для определения величины заполнения.

2 ответа

Решение

Вы должны поставить format_string как переменная

temp = f'{i:{format_string}}' + temp

следующий код после : не анализируется как переменная, пока вы четко не укажете. И спасибо @timpietzcker за ссылку на документы: отформатированные строковые литералы

Вы должны держать маркеры выравнивания и отступа отдельно друг от друга:

def display_pattern(n):
    padding = 4
    align = ">"
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:{align}{padding}}' + temp
        print(temp)

РЕДАКТИРОВАТЬ:

Я думаю, что это не совсем правильно. Я провел некоторое тестирование, а также следующие работы:

def display_pattern(n):
    align = ">4"
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:{align}}' + temp
        print(temp)

Поэтому я не могу сказать, почему ваш метод не сработал...

Другие вопросы по тегам