Вопрос-Ответ

Python's many ways of string formatting — are the older ones (going to be) deprecated?

Множество способов форматирования строк в 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, который, как я понимаю, предлагает уникальные возможности)

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

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

Переведено автоматически
Ответ 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 была заменена размытой, двусмысленной прозой о том, как каждый стиль "обеспечивает свои собственные компромиссы и преимущества". То есть в карточках больше нет не только формального определения устаревания, но и текущие документы открыто признают, что % форматирование, по крайней мере, имеет некоторые "преимущества" перед другими подходами.

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

2023-08-05 19:47 python