суббота, 7 октября 2017 г.

Форматируемые строковые литералы

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

X-Plane 11, 12 - любитель, Фото любитель со стажем

Постоянные читатели

Архив блога