2.4.3. Форматируемые строковые
литералы
Но
вое в версии 3.6.
Форматируемые строковые литералы или
f-строки это строковые литералы,
перед которыми стоит
'f'
или
'F'. Эти строки могут
содержать заменяемые поля, которые
представляют из себя выражения
ограниченные фигурными скобками
{}.
В то время как обычные строковые литералы
всегда имеют постоянные значения,
форматируемые строки это настоящие
выражения, вычисляемые во время выполнения
программы
, а
именно в момент активизации f-строки.
Эскейп последовательности декодируются
так же как в обычных строковых литералах
(за исключением случаем когда литерал
помечается как сырая строка, символом
r). После декодирования
грамматика для содержимого строки может
быть представлена так:
f_string
::= (
literal_char
| "{{" | "}}" |
replacement_field)*
replacement_field ::= "{" f_expression ["!" conversion] [":" format_spec] "}"
f_expression ::= (conditional_expression | "*" or_expr)
("," conditional_expression | "," "*" or_expr)* [","]
| yield_expression
conversion ::= "s" | "r" | "a"
format_spec
::= (
literal_char
| NULL |
replacement_field)*
literal_char
::=
Части строки вне фигурных
скобок воспринимаются как литералы, за
исключением двойных фигурных скобок
'{{' или
'}}',
которые
замещаются соответствующими одинарными
фигурными скобками. Одиночная
открывающая фигурная скобка
'{'
отмечает поле замены, которое начинается
с питоновского выражения. После этого
выражения может следовать поле
преобразования,
начинающееся
символом восклицательный знак '!'.
Может быть добавлен спецификатор
форматирования, начинающийся символом
двоеточие
':'. Поле замены
заканчивается закрывающей фигурной
скобкой
'}'.
Выражения в форматируемых строковых
литералах трактуется как питоновское
регулярное выражение окруженное
скобками, за несколькими исключениями.
Не позволяется пустое выражение, и
выражение типа
lambda
должно быть окружено явными скобками.
Выражение замены может содержать разрыв
строки (также как в строках внутри
тройных кавычек), но не может включать
комментарии.
Каждое выражение
вычисляется слева на право в том
контексте, в котором появилсь форматируемый
строковый литерал.
Если преобразование задано, то результат
вычисления выражения перед форматированием
преобразуется. Преобразование
'!s'
вызывает функцию
str(),
'!r' вызывает
repr(),
а
'!a' вызывает
ascii().
Результат затем форматируется
при помощи протокола
format().
Указатель форматирования передается
в метод
__format__()
из выражения или из результата
преобразования. Если указатель
форматирования опущен, то передается
пустая строка. Результат форматирования
затем включается в финальное значение
целой строки.
Указатель форматирования верхнего
уровня может включать вложенные в друг
друга поля замены. Эти вложенные поля
могут включать свои собственные поля
преобразования и указатели форматирования,
но не могут включать более глубоко
вложенные поля замены.
Форматируемые строковые литералы
могут сцепляться, но поля замены не
могут быть разделены через литералы.
Некоторые примеры форматируемых
строковых литералов:
>>> name = "Fred"
>>> f"He said his name is {name!r}."
"He said his name is 'Fred'."
>>> f"He said his name is {repr(name)}." # repr() is equivalent to !r
"He said his name is 'Fred'."
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
Следствием использования того же
синтаксиса, что и в обычных строковых
литералах является условие: символы в
полях замены не должны конфликтовать
с кавычками, окружающими форматируемый
строковый литерал:
f"abc {a["x"]} def" # ошибка: весь строковый литерал заканчивается проеждевременно
f"abc {a['x']} def" # решение проблемы: использовать разные кавычки
Обратная косая черта в выражениях
форматирования не допускается и вызывает
ошибку:
f"newline: {ord('\n')}" # вызывет ошибку SyntaxError
Чтобы включить значение с обратной
чертой, созлайте временную переменную.
>>> newline = ord('\n')
>>> f"newline: {newline}"
'newline: 10'
Форматируемые строковые литералы не
могут использоваться как строки документы
(docstrings), даже если они и не содержат
выражений.
>>> def foo():
... f"Not a docstring"
...
>>> foo.__doc__ is None
True
Смотрите страницу
PEP
498 для ознакомления с предложением,
которое добавило форматированные
строковые литералы и метод
str.format(),
который использует связанный механизм
форматирования строк.