Форматированные строковые литералы также известны как f-строки или форматные строки.
Форматированные строковые литералы — это литералы-строки с префиксом f или F.

    animal = 'кот'
age = 7
f'У меня есть {animal}. Ему {age+1}.' # У меня есть кот. Ему 8.

def print_me(one, two):
print(f'Вот тебе {one}, а вот тебе {two}.')

Такие строки могут содержать маркеры для замещения (выражения в фигурных скобах — {}). В то время как обычные литералы представляют собой константы, значение форматированных строк вычисляются в ходе исполнения программы.

Часть строки вне фигурных скобок остаётся неизменной (за исключением двойных фигурных скобок {{ или }}, которые заменяются на одиночные). Одиночная открывающая скобка { сигнализирует о начале маркера замены (выражения на Питоне), после которого могут следовать указатель преобразования (начинается с восклицательного знака !), а также указатель формата (начинается с двоеточия :). Маркер завершается фигурной закрывающей скобкой }.

Внимание
Попытка использования обратных косых черт (слешей) в форматной строке (например, \n) приведёт к исключению SyntaxError.

Общий вид маркера: {(выражение)[!преобразование][:формат]}.

Маркеры могут включать в себя другие маркеры.

Выражения внури скобок обрабатываются как обычные выражения с несколькими оговорками:
  • Пустые выражения недопустимы;
  • Лямбда-выражения должны быть окружены скобками;
  • Допускаются переносы строк (например, в литералах с тройными кавычками), однако комментарии не поддерживаются;
  • Каждое выражение вычисляется в том же контексте, в котором содержится форматная строка, слева направо.

Далее преобразование использует мини-язык форматирования по методу format(). Настройки формата передаются в метод __format__() (если они не указаны, передаётся пустая строка).

    animal = 'cat'
f"{animal:>6}" # ' cat'

После этого маркер в строке заменяется отформатированным результатом вычисления выражения.

Внимание
Форматные строки можно склеивать, однако маркеры при этом не должны принадлежать разным литералам.

Преобразование


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

!rИспользовать repr().
!sИспользовать str().
!aИспользовать ascii().

    animal = 'cat'
f'I have a {animal!r}.' # I have a 'cat'.
f'I have a {repr(animal)}.' # I have a 'cat'.

# Вложенные маркеры:
width = 10
precision = 4
value = decimal.Decimal('12.34567')
f'result: {value:{width}.{precision}}' # result: 12.35

Упрощение для отладки


Начиная с +py3.8 можно использовать форму f'{my_var =}', чтобы вывести название переменной и её текущее значение.

    my_var = 'cat'
print(f'{my_var=}') # my_var = 'cat'
# Имеется возможность дополнения строки до указанной длины:
print(f'{my_var.upper() = :a^7}') # my_var = 'aaCATaa'
print(f'{my_var.upper() = :b>7}') # my_var = 'bbbbCAT'

Синонимы поиска: Форматные строки (f-string), f-string, f-строки
На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.