2.4.3. Форматируемые строковые литералы
Новое
в версии 3.6.
Форматируемые строковые литералы или
f-строки это строковые литералы,
перед которыми стоят буквы 'f'
или 'F'
. Эти строки могут
содержать заменяемые поля, которые
представляют из себя выражения
ограниченные фигурными скобками {}
.
В то время как обычные строковые литералы
всегда имеют постоянные значения,
форматируемые строки это настоящие
выражения, вычисляемые во время выполнения
программы, а
именно в момент активизации f-строки.Эскейп последовательности декодируются так же как в обычных строковых литералах (за исключением случаев, когда литерал помечается как сырая строка(raw), символом r). После декодирования грамматика для содержимого строки может быть представлена так:
f_string ::= (
literal_char
| "{{" | "}}" | replacement_field
)*replacement_field ::= "{"format_spec ::= (f_expression
["!"conversion
] [":"format_spec
] "}" f_expression ::= (conditional_expression
| "*"or_expr
) (","conditional_expression
| "," "*"or_expr
)* [","] |yield_expression
conversion ::= "s" | "r" | "a"
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()
,
который использует связанный механизм
форматирования строк.
Комментариев нет:
Отправить комментарий