В 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
-стилевое форматирование существует с младенчества PythonsTemplate
Класс был введен в Python 2.4format
Метод был введен в Python 2.6f
-strings были введены в Python 3.6
Мои вопросы:
- Является
printf
устаревшим -стиль форматирование или будет устаревшим? - В том
Template class
, является лиsubstitute
метод устаревшим или будет устаревшим? (Я не говорю о томsafe_substitute
, что, как я понимаю, предлагает уникальные возможности)
Похожие вопросы и почему я думаю, что они не дубликаты:
Форматирование строки Python:% vs. формат - обрабатывает только методы 1 и 2 и спрашивает, какой из них лучше; мой вопрос явно об устаревании в свете дзен Python
Параметры форматирования строк: за и против - обрабатываются только методы 1a и 1b в вопросе, 1 и 2 в ответе, а также ничего об устаревании
расширенное форматирование строк по сравнению с шаблонными строками - в основном о методах 1 и 3, и не рассматривает устаревание
Выражения форматирования строк (Python) - в ответе упоминается, что исходный подход «%» планируется упразднить . Но в чем разница между запланированным прекращением поддержки , ожидающим прекращением поддержки и фактическим прекращением поддержки ? А
printf
метод -style не вызывает даже aPendingDeprecationWarning
, так что действительно ли он устарел? Этот пост тоже довольно старый, поэтому информация может быть устаревшей.
Formatter
урок?Ответы:
Хотя в документации есть различные указания на то, что
.format
и f-строки превосходят%
строки, не существует плана, позволяющего отказаться от последних.В коммите Проблема № 14123: Явно упомяните, что форматирование строки% в старом стиле имеет оговорки, но не исчезнет в ближайшее время. , вдохновлено проблемой. Укажите, что в настоящее время нет планов по
%
отмене форматирования в стиле printf , документы по -форматированию были отредактированы, чтобы содержать эту фразу:(Акцент мой.)
Эта фраза была удалена позже в коммите Close # 4966: обновите документацию последовательности, чтобы лучше объяснить состояние современного Python . Это может показаться знаком того, что план отказа от
%
форматирования вернулся на карту ... но погружение в трекер ошибок показывает, что намерение было противоположным. В трекере ошибок автор коммита характеризует изменение следующим образом :Другими словами, у нас было два последовательных изменения в
%
документах -formatting, чтобы явно подчеркнуть, что он не будет устаревшим, не говоря уже об удалении. Документы по-прежнему придерживаются мнения об относительных достоинствах различных видов форматирования строк, но они также очищают%
форматирование -форматирование не будет устаревшим или удаленным.Более того, последнее изменение этого абзаца в марте 2017 года изменило его с этого ...
... к этому:
Обратите внимание на изменение с «помогает избежать» на «может помочь избежать», и как четкие рекомендации
.format
и f-струны были заменены пушистой двусмысленной прозой о том, как каждый стиль «предоставляет свои собственные компромиссы и преимущества» . То есть не только формального отказа больше нет на картах, но и текущие документы открыто признают, что%
форматирование по крайней мере имеет некоторые «преимущества» по сравнению с другими подходами.Из всего этого я могу сделать вывод, что движение за осуждение или удаление
%
форматирования не только пошатнулось, но и полностью и навсегда остановлено.источник
%
. Теперь, когда от политики отказа от крупномасштабных модификаций кода отказались, их возражения тоже исчезают. В конечном итоге, поддержание обеих форм без каких-либо преимуществ, поскольку%
в какой-то момент синтаксис printf все равно будет удален. Мы просто еще не знаем, когда, поэтому язык стоил смягчить.Новый
.format()
метод призван заменить старый%
синтаксис форматирования. Последнее было преуменьшено (но официально еще не устарело ). В документации метода сказано следующее:(Акцент мой).
Для того, чтобы поддерживать обратную совместимость и сделать переход легче, старый формат был оставлен на месте на данный момент . Из исходного предложения PEP 3101 :
Обратите внимание на то, что пока не придет время отказаться от старой системы ; она не устарела, но новая система должна использоваться всякий раз, когда вы пишете новый код .
Новая система имеет то преимущество, что вы можете комбинировать кортежный и словарный подход старого средства
%
форматирования:и расширяется через
object.__format__()
ловушки, используемой для обработки форматирования отдельных значений.Обратите внимание, что в старой системе был
%
иTemplate
класс, причем последний позволяет создавать подклассы, которые добавляют или изменяют его поведение. Система нового стиля имеетFormatter
класс занять ту же нишу.Python 3 еще больше отошел от устаревания, вместо этого выдает предупреждение в разделе
printf
форматирования строк в стиле :Python 3.6 также добавил форматированные строковые литералы , которые вставляют выражения в строки формата. Это самый быстрый метод создания строк с интерполированными значениями, и его следует использовать вместо того,
str.format()
где вы можете использовать литерал.источник
Formatter
вы можете создавать собственные форматы, например те, которыеdatetime
используются объектами. Кроме того, поскольку.format
это функция, вы можете использовать ее для более прямого создания вызываемого ленивого форматирования: например,fmt = '{} - {}'.format; fmt(a, b)
Template
это связано%
со старой системой . В частности, состояния PEP, которые вы связываете. Хотя есть некоторое совпадение между этим предложением иstring.Template
, чувствуется, что каждое из них служит определенной потребности и что одно не устраняет другого. В вашем ответе может возникнуть путаница, чтоTemplate
форматирование, являющееся частью старой системы , тоже устарело.Formatter
класс может удовлетворить те же потребности, что иstring.Template()
.[...]should be preferred to the % formatting[...]
эта часть удалена из документации. docs.python.org/3/library/stdtypes.html#str.format%
Оператор для строки форматирования не рекомендуется, и не собирается быть удалены - несмотря на другие ответы.Каждый раз, когда этот вопрос поднимается в списке разработчиков 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
вызовет метод строкового объекта во время выполнения, который автоматически интерполирует переменные из текущей области в строку:источник
__format__
. Так , например,format(Decimal('0.1'), '.20f')
против'%.20f' % Decimal('0.1')
. Последний переводит Decimal в число с плавающей запятой.f
в Python 3?f-strings
, Используемые выше, новая функция в языке Питон 3.6. Он не существует в предыдущих версиях и вызовет в них синтаксическую ошибку.Последняя позиция Гвидо по этому поводу, кажется, указана здесь:
Что нового в Python 3.0
И сам PEP3101 , последняя модификация которого датируется (пт, 30 сентября 2011 г.), так что, я полагаю, в последнее время нет прогресса в этом.
источник
Глядя на более старые документы Python и PEP 3101, было сказано, что оператор% будет устаревшим и удален из языка в будущем. Следующее заявление было в документации Python для Python 3.0, 3.1 и 3.2:
Если вы пойдете в же разделу в документах Python 3.3 и 3.4, вы увидите, что этот оператор был удален. Я также не могу найти в документации каких-либо других заявлений, указывающих на то, что оператор будет устаревшим или удален из языка. Также важно отметить, что PEP3101 не подвергался модификации более двух с половиной лет (пт, 30 сентября 2011 г.).
Обновить
PEP461 Добавление% форматирования к байтам и байтовому массиву допускается и должно быть частью Python 3.5 или 3.6. Это еще один признак того, что оператор% жив и здоров.
источник