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. Это еще один признак того, что оператор% жив и здоров.