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_expressionconversion ::= "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(),
который использует связанный механизм
форматирования строк.
Комментариев нет:
Отправить комментарий