Множество способов форматирования строк в 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
Форматирование в стиле Python существует с младенчества Pythons- Класс
Template
был представлен в Python 2.4 - Метод
format
был представлен в Python 2.6 f
-строки были введены в Python 3.6
Мои вопросы:
- Форматирование в
printf
стиле устарело или будет устаревать? - В
Template class
методsubstitute
устарел или будет устаревать? (Я не говорю оsafe_substitute
, который, как я понимаю, предлагает уникальные возможности)
Похожие вопросы и почему я думаю, что они не являются дубликатами:
Форматирование строк в Python: % vs .format — обрабатывает только методы 1 и 2 и спрашивает, какой из них лучше; мой вопрос явно касается устаревания в свете дзен Python
Параметры форматирования строк: плюсы и минусы — рассматривает только методы 1a и 1b в вопросе, 1 и 2 в ответе, а также ничего об устаревании
расширенное форматирование строк по сравнению со строками шаблонов — в основном касается методов 1 и 3 и не устраняет проблему устаревания
Выражения для форматирования строк (Python) — в ответе упоминается, что планируется, что исходный подход '%' устареет. Но в чем разница между запланированным устареванием, ожидающим устаревания и фактическим устареванием? И метод
printf
-style не вызывает дажеPendingDeprecationWarning
, так что это действительно будет устаревшим? Это сообщение также довольно старое, поэтому информация может быть устаревшей.
Смотрите также
Переведено автоматически
Ответ 1
Новый .format()
метод предназначен для замены старого %
синтаксиса форматирования. Акцент на последнем снят (но он пока официально не является устаревшим). В документации к методу указано следующее.:
Этот метод форматирования строк является новым стандартом в Python 3, и его следует предпочесть по сравнению с
%
форматированием, описанным в разделе Операции форматирования строк в новом коде.
(Выделено мной).
Для поддержания обратной совместимости и упрощения перехода старый формат был оставлен на месте пока. Из исходного предложения PEP 3101:
Обратная совместимость
Обратную совместимость можно поддерживать, оставив существующие механизмы на месте. Новая система не конфликтует ни с одним из названий методов существующих методов форматирования строк, поэтому обе системы могут сосуществовать, пока не придет время отказаться от старой системы.
Обратите внимание на пока не придет время отказаться от старой системы; она не устарела, но новая система должна использоваться всякий раз, когда вы пишете новый код.
Преимущество новой системы в том, что вы можете комбинировать кортежи и словарный подход старого %
форматировщика:
"{greeting}, {0}".format(world, greeting='Hello')
и расширяется с помощью object.__format__()
хука, используемого для обработки форматирования отдельных значений.
Обратите внимание, что в старой системе был класс %
и Template
, где последний позволяет вам создавать подклассы, которые добавляют или изменяют его поведение. В системе нового стиля есть Formatter
класс, который заполняет ту же нишу.
Python 3 еще больше отошел от устаревания, вместо этого выдавая вам предупреждение в printf
стиле форматирования строк раздел:
Примечание: Операции форматирования, описанные здесь, имеют множество особенностей, которые приводят к ряду распространенных ошибок (например, неправильному отображению кортежей и словарей). Использование более новых форматированных строковых литералов или
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 , нет никаких планов по отказу от последних.
В фиксации проблема # 14123: явно упоминается, что форматирование строк в старом стиле % имеет оговорки, но не исчезнет в ближайшее время., вдохновленный проблемой Укажите, что в настоящее время нет планов по отказу от форматирования в стиле printf, документы по %
-форматированию были отредактированы, чтобы содержать эту фразу:
Поскольку новый синтаксис форматирования строк является более гибким и естественным образом обрабатывает кортежи и словари, он рекомендуется для нового кода. Однако, в настоящее время нет планов по отказу от форматирования в стиле printf.
(Выделено мной.)
Эта фраза была удалена позже, в commit Close # 4966: revamp the sequence docs, чтобы лучше объяснить состояние современного Python. Это может показаться признаком того, что план отказа от %
форматирования вернулся к карточкам... но изучение багтрекера показывает, что намерение было противоположным. В баг-трекере автор коммита характеризует изменение следующим образом:
- изменен текст, описывающий взаимосвязь между форматированием в стиле printf и методом str.format (намеренно устранен намек на то, что первому существует реальная опасность исчезновения - для нас просто непрактично серьезно рассматривать возможность его устранения)
Другими словами, у нас было два последовательных изменения в документации по %
форматированию, призванных явно подчеркнуть, что он не будет устаревшим, не говоря уже об удалении. В документах по-прежнему высказывается мнение об относительных достоинствах различных видов форматирования строк, но также ясно, что %
-форматирование не будет признано устаревшим или удалено.
Более того, самое последнее изменение в этом абзаце, внесенное в марте 2017 года, изменило его с этого...
Описанные здесь операции форматирования имеют множество особенностей, которые приводят к ряду распространенных ошибок (например, неправильному отображению кортежей и словарей). Использование строковых литералов нового формата или
str.format
интерфейса помогает избежать этих ошибок. Эти альтернативы также предоставляют более мощные, гибкие и расширяемые подходы к форматированию текста.
... к этому:
Описанные здесь операции форматирования имеют множество особенностей, которые приводят к ряду распространенных ошибок (например, неправильному отображению кортежей и словарей). Использование строковых литералов нового формата,
str.format
интерфейса или строк шаблона может помочь избежать этих ошибок. Каждая из этих альтернатив обеспечивает свои собственные компромиссы и преимущества в виде простоты, гибкости и / или расширяемости.
Обратите внимание на изменение с "помогает избежать" на "может помочь избежать", и как четкая рекомендация .format
и f-strings была заменена размытой, двусмысленной прозой о том, как каждый стиль "обеспечивает свои собственные компромиссы и преимущества". То есть в карточках больше нет не только формального определения устаревания, но и текущие документы открыто признают, что %
форматирование, по крайней мере, имеет некоторые "преимущества" перед другими подходами.
Из всего этого я бы сделал вывод, что движение к устареванию или удалению %
форматирования не только пошатнулось, но и потерпело полное и необратимое поражение.