# 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Форматирование в стиле Python существует с младенчества Pythons
Класс Template был представлен в Python 2.4
Метод format был представлен в Python 2.6
f-строки были введены в Python 3.6
Мои вопросы:
Форматирование в printf стиле устарело или будет устаревать?
В Template classметод substitute устарел или будет устаревать? (Я не говорю о safe_substitute, который, как я понимаю, предлагает уникальные возможности)
Похожие вопросы и почему я думаю, что они не являются дубликатами:
Выражения для форматирования строк (Python) — в ответе упоминается, что планируется, что исходный подход '%' устареет. Но в чем разница между запланированным устареванием, ожидающим устаревания и фактическим устареванием? И метод printf-style не вызывает даже PendingDeprecationWarning, так что это действительно будет устаревшим? Это сообщение также довольно старое, поэтому информация может быть устаревшей.
Новый .format() метод предназначен для замены старого % синтаксиса форматирования. Акцент на последнем снят (но он пока официально не является устаревшим). В документации к методу указано следующее.:
Этот метод форматирования строк является новым стандартом в Python 3, и его следует предпочесть по сравнению с % форматированием, описанным в разделе Операции форматирования строк в новом коде.
(Выделено мной).
Для поддержания обратной совместимости и упрощения перехода старый формат был оставлен на месте пока. Из исходного предложения PEP 3101:
Обратная совместимость
Обратную совместимость можно поддерживать, оставив существующие механизмы на месте. Новая система не конфликтует ни с одним из названий методов существующих методов форматирования строк, поэтому обе системы могут сосуществовать, пока не придет время отказаться от старой системы.
Обратите внимание на пока не придет время отказаться от старой системы; она не устарела, но новая система должна использоваться всякий раз, когда вы пишете новый код.
Преимущество новой системы в том, что вы можете комбинировать кортежи и словарный подход старого % форматировщика:
"{greeting}, {0}".format(world, greeting='Hello')
и расширяется с помощью object.__format__() хука, используемого для обработки форматирования отдельных значений.
Обратите внимание, что в старой системе был класс % и Template, где последний позволяет вам создавать подклассы, которые добавляют или изменяют его поведение. В системе нового стиля есть Formatter класс, который заполняет ту же нишу.
Примечание: Операции форматирования, описанные здесь, имеют множество особенностей, которые приводят к ряду распространенных ошибок (например, неправильному отображению кортежей и словарей). Использование более новых форматированных строковых литералов или str.format() интерфейса помогает избежать этих ошибок. Эти альтернативы также предоставляют более мощные, гибкие и расширяемые подходы к форматированию текста.
В Python 3.6 также добавлены отформатированные строковые литералы, которые вставляют выражения в строки формата. Это самый быстрый метод создания строк с интерполированными значениями, и его следует использовать вместо str.format() везде, где вы можете использовать литерал.
Ответ 2
% Оператор для форматирования строк не устарел и не будет удален - несмотря на другие ответы. Каждый раз, когда тема поднимается в списке разработчиков 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"").
Добавление префикса string by f вызовет метод для объекта string во время выполнения, который автоматически интерполирует переменные из текущей области видимости в строку:
>>> value = 80 >>> f'The value is {value}.' 'The value is 80.'
Ответ 3
При просмотре старых документов 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 Добавление % форматирования к байтам и bytearray допускается и должно быть частью Python 3.5 или 3.6. Это еще один признак того, что оператор % жив и работает.
Ответ 4
Хотя в документах есть различные указания на то, что .format и f-strings превосходят % strings , нет никаких планов по отказу от последних.
Поскольку новый синтаксис форматирования строк является более гибким и естественным образом обрабатывает кортежи и словари, он рекомендуется для нового кода. Однако, в настоящее время нет планов по отказу от форматирования в стиле printf.
изменен текст, описывающий взаимосвязь между форматированием в стиле printf и методом str.format (намеренно устранен намек на то, что первому существует реальная опасность исчезновения - для нас просто непрактично серьезно рассматривать возможность его устранения)
Другими словами, у нас было два последовательных изменения в документации по %форматированию, призванных явно подчеркнуть, что он не будет устаревшим, не говоря уже об удалении. В документах по-прежнему высказывается мнение об относительных достоинствах различных видов форматирования строк, но также ясно, что %-форматирование не будет признано устаревшим или удалено.
Описанные здесь операции форматирования имеют множество особенностей, которые приводят к ряду распространенных ошибок (например, неправильному отображению кортежей и словарей). Использование строковых литералов нового формата или str.format интерфейса помогает избежать этих ошибок. Эти альтернативы также предоставляют более мощные, гибкие и расширяемые подходы к форматированию текста.
... к этому:
Описанные здесь операции форматирования имеют множество особенностей, которые приводят к ряду распространенных ошибок (например, неправильному отображению кортежей и словарей). Использование строковых литералов нового формата, str.format интерфейса или строк шаблона может помочь избежать этих ошибок. Каждая из этих альтернатив обеспечивает свои собственные компромиссы и преимущества в виде простоты, гибкости и / или расширяемости.
Обратите внимание на изменение с "помогает избежать" на "может помочь избежать", и как четкая рекомендация .format и f-strings была заменена размытой, двусмысленной прозой о том, как каждый стиль "обеспечивает свои собственные компромиссы и преимущества". То есть в карточках больше нет не только формального определения устаревания, но и текущие документы открыто признают, что % форматирование, по крайней мере, имеет некоторые "преимущества" перед другими подходами.
Из всего этого я бы сделал вывод, что движение к устареванию или удалению % форматирования не только пошатнулось, но и потерпело полное и необратимое поражение.