Python много способов форматирования строк - устаревшие (будут) устарели?

В Python есть как минимум шесть способов форматирования строки:

In [1]: world = "Earth"

# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'

# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'

# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'

# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'

# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'

In [7]: from string import Template

# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'

Краткая история различных методов:

  • форматирование printf -style существует с детства Pythons
  • Класс Template был представлен в Python 2.4
  • Метод format был представлен в Python 2.6
  • f -strings были введены в Python 3.6

Мои вопросы:

  • Является ли форматирование printf -style устаревшим или будет устаревшим?
  • В Template class метод substitute или будет объявлен устаревшим? (Я не говорю о safe_substitute, который, насколько я понимаю, предлагает уникальные возможности)

Подобные вопросы и почему я думаю, что они не дубликаты:

Смотрите также

Ответы

Ответ 1

Хотя в документах есть различные указания на то, что .format и f-strings превосходят % strings, не существует плана выживания, который когда-либо осуждает последний.

В коммите Проблема № 14123. Явно упомяните, что форматирование строки в старом стиле% имеет недостатки, но в ближайшее время не исчезнет. , вдохновленный проблемой. Укажите, что в настоящее время нет планов отказаться от форматирования в стиле printf, документы для % -formatting были отредактированы так, чтобы они содержали эту фразу:

Поскольку новый синтаксис строки -formatting более гибкий и, естественно, обрабатывает кортежи и словари, он рекомендуется для нового кода. Однако в настоящее время нет планов отказаться от форматирования в стиле printf.

(Акцент мой.)

Эта фраза была удалена позже, в коммите Close # 4966: обновите документацию последовательности, чтобы лучше объяснить состояние современного Python. Это может показаться знаком того, что план по устаревшему форматированию % вернулся на карты... но погружение в систему отслеживания ошибок показывает, что цель была противоположной. На трекере ошибок автор коммита характеризует изменение следующим образом:

  • изменил прозу, описывающую взаимосвязь между форматированием в стиле printf и методом str.format (преднамеренно удаляя из виду, что первое представляет собой реальную опасность исчезновения - для нас просто нецелесообразно всерьез задумываться об его уничтожении)

Другими словами, у нас было два последовательных изменения в документах % -formatting, предназначенных для явного подчеркивания того, что он не будет устарел, не говоря уже об удалении. Документы остаются сомнительными относительно относительных достоинств различных видов форматирования строк, но они также ясно, что % -formatting не будет устаревшим или удаленным.

Более того, самое последнее изменение этого пункта в марте 2017 года изменило его с этого...

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

... к этому:

Операции форматирования, описанные здесь, демонстрируют различные причуды, которые приводят к ряду распространенных ошибок (таких как неправильное отображение кортежей и словарей). Использование более новых форматированных строковых литералов, интерфейса str.format или строк шаблона может помочь избежать этих ошибок. Каждая из этих альтернатив обеспечивает свои собственные компромиссы и преимущества простоты, гибкости и/или расширяемости.

Обратите внимание на изменение с "помогает избежать" на "может помочь избежать", и как четкая рекомендация .format и f-strings была заменена пушистой, двусмысленной прозой о том, как каждый стиль "обеспечивает свои собственные компромиссы и преимущества". То есть, формального устаревания больше нет на картах, но текущие документы открыто признают, что форматирование % по крайней мере, имеет некоторые "преимущества" по сравнению с другими подходами.

Из всего этого я бы заключил, что движение за устаревание или удаление % форматирования не только не сработало, но и полностью и навсегда потерпело поражение.

Ответ 2

Новый .format() предназначен для замены старого синтаксиса форматирования %. Последнее было преуменьшено (но официально еще не устарело). В документации метода указано следующее:

Этот метод форматирования строк является новым стандартом в Python 3, и его следует отдавать предпочтению форматированию % описанному в Операциях форматирования строк в новом коде.

(Акцент мой).

Чтобы обеспечить обратную совместимость и сделать переход проще, старый формат пока оставлен на месте. Из первоначального предложения PEP 3101:

Обратная совместимость

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

Обратите внимание, пока не настало время отказаться от устаревшей системы; это не устарело, но новая система должна использоваться всякий раз, когда вы пишете новый код.

Преимущество новой системы в том, что вы можете комбинировать подход кортежа и словаря старого форматера %:

"{greeting}, {0}".format(world, greeting='Hello')

и расширяется с помощью ловушки object.__format__() используемой для обработки форматирования отдельных значений.

Обратите внимание, что в старой системе был % и класс Template, где последний позволяет создавать подклассы, которые добавляют или изменяют ее поведение. Новая -style система имеет Formatter класс, чтобы заполнить ту же нишу.

Python 3 еще больше отошел от устаревшего, вместо этого выдает предупреждение в разделе printf -style String Formatting:

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

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

Ответ 3

Оператор % для форматирования строк не устарел и не собирается удаляться - несмотря на другие ответы.
Каждый раз, когда тема поднимается в списке развития Python, есть сильные разногласия, по которым лучше, но нет споров о том, удалить ли классический способ - он останется. Несмотря на то, что PEP 3101 был обозначен, Python 3.1 пришел и ушел, а форматирование % все еще существует.

Утверждения о сохранении классического стиля ясны: это просто, быстро, быстро сделать для коротких вещей. Использование метода .format не всегда читаемо - и едва ли кто-либо, даже среди основных разработчиков, может использовать полный синтаксис, предоставляемый .format, без необходимости искать ссылку  Еще в 2009 году у него были такие сообщения: http://mail.python.org/pipermail/python-dev/2009-October/092529.html - с тех пор предмет едва отображался в списках.

Обновление 2016

В текущей версии разработки Python (которая станет Python 3.6) существует третий метод строковой интерполяции, описанный в PEP-0498. Он определяет новый префикс цитаты f"" (помимо текущих u"", b"" и r"").

Префикс строки f вызовет метод для строкового объекта во время выполнения, который автоматически будет интерполировать переменные из текущей области в строку:

>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'

Ответ 4

Последняя позиция Guido на этом, кажется, указана здесь:

Что нового в Python 3.0

PEP 3101: Новый подход к форматированию строк

Новая система для встроенных операций форматирования строк заменяет оператор форматирования строки%. (Тем не менее, оператор% все еще поддерживается; он будет устаревшим в Python 3.1 и удален из язык в более позднее время.) Прочитайте PEP 3101 для полного совка.

И PEP3101, который имеет последнее изменение, начиная с (Fri, 30 сентября 2011 г.), поэтому никакого прогресса, это, я полагаю.

Ответ 5

Глядя на старые документы Python и PEP 3101, было высказано утверждение, что оператор% будет исключен и удален из языка в будущем. Следующее утверждение было в документации по Python для Python 3.0, 3.1 и 3.2:

Поскольку str.format() довольно новый, во многих кодах Python все еще используется оператор%. Однако, поскольку этот старый стиль форматирования в конечном итоге будет удален из языка, обычно следует использовать str.format().

Если вы перейдете к одному и тому же разделу документов Python 3.3 и 3.4, вы увидите, что оператор был удален. Я также не могу найти никаких других утверждений где-либо еще в документации, указывающих, что оператор будет исключен или удален из языка. Также важно отметить, что PEP3101 не изменялся в течение двух с половиной лет (пт, 30 сентября 2011 г.).

Обновить

PEP461 Добавление% форматирования в байты и байтовый массив принято и должно быть частью Python 3.5 или 3.6. Это еще один признак того, что оператор% жив и здоров.