Шаг 27.
Python: тонкости программирования. ... . Способы форматирования строковых значений. №3. Интерполяция литеральных строк (Python 3.6+)

    На этом шаге мы рассмотрим, в чем заключается этот метод.

    Python 3.6 добавляет еще один способ форматирования строк, который называется форматированными строковыми литералами (Formatted String Literals). Этот новый способ форматирования строк позволяет использовать выражения Python, которые встраиваются в строковые константы. Ниже дан простой пример, который поможет вам проникнуться этим функциональным средством языка:

>>> f'Привет, {name}!'
'Привет, Боб!'

    В новом синтаксисе форматирования заложена большая мощь. Поскольку он позволяет встраивать произвольные выражения Python, вы даже можете выполнять локальные арифметические действия, как показано ниже:

>>> a = 5
>>> b = 10
>>> f'Пять плюс десять равняется {a + b}, а не {2 * (a + b)}.'
'Пять плюс десять равняется 15, а не 30.'

    За кадром форматированные строковые литералы представляют собой функциональное средство синтаксического анализатора Python, которое преобразовывает f-строки в серию строковых констант и выражений. Затем они объединяются, формируя окончательное строковое значение.

    Предположим, что у нас есть следующая функция greet(), которая содержит f-строку:

>>> def greet(name, question):
	return f"Привет, {name}! Как {question}?"

>>> greet('Боб', 'дела')
'Привет, Боб! Как дела?'

    Если эту функцию дизассемблировать и проинспектировать то, что происходит за кадром, то мы увидим, что в этой функции f-строка преобразовывается в нечто наподобие следующего:

>>> def greet(name, question):
	return("Привет, " + name + "! Как " + question + "?")

    На практике реализация слегка быстрее, чем эта, потому что в ней в качестве оптимизации используется код операции BUILD_STRING.


См. Python 3. Спорный вопрос в трекере ошибок № 27078: https://bugs.python.org/issue27078.

   

>>> import dis
>>> dis.dis(greet)
  2           0 LOAD_CONST               1 ('Привет, ')
              2 LOAD_FAST                0 (name)
              4 FORMAT_VALUE             0
              6 LOAD_CONST               2 ('! Как ')
              8 LOAD_FAST                1 (question)
             10 FORMAT_VALUE             0
             12 LOAD_CONST               3 ('?')
             14 BUILD_STRING             5
             16 RETURN_VALUE

    Строковые литералы также поддерживают существующий синтаксис форматных строк метода str.format(). Это позволяет решать те же самые задачи форматирования, которые мы обсудили в предыдущих шагах:

>>> f'Эй, {name}! Вот ошибка {errno:#x}!"
"Эй, Боб! Вот ошибка 0xbadc0ffee!"

    Новые форматированные строковые литералы Python аналогичны шаблонным литералам JavaScript, добавленным в ES2015. Они являются довольно приятным дополнением к языку. Подробнее о форматированных строковых литералах вы можете узнать из официальной документации Python.


См. документацию Python "Форматированные строковые литералы": https://docs.python.org/3/reference/lexical_analysis.html#formatted-string-literals.

    На следующем шаге мы рассмотрим шаблонные строки.




Предыдущий шаг Содержание Следующий шаг