LINUX.ORG.RU

фоматирование строк в Python

 ,


0

1

После прочтения М. Лутца главы о строках мозг затрял на распутье. Интернет не дал вразумительного ответа, что лучше:

- форматирование через оператор «%»
- форматирование методом .format()

Питон изучается 3 версии. Прошу развернуть ответ. И интересно, что быстрее. Стоит заморачиваться по этому вопросу?

Ответ на: комментарий от masterdilly

Да, всё равноценно, что тебе удобнее то и используй. Я немножко отдаю предпочтение format и f-строкам.

vvn_black ★★★★★
()

После прочтения М. Лутца

чем закончилось? а то я не осилил всю воду

ты забыл f""

по мне format логичнее и проще использовать с распаковкой и строками-форматтерами, но нужно писать на несколько символов больше и это бывает не очень удобно.

% - грозились выпилить, но этого не будет ибо его logging использует, да еще туча всякого легаси

Dred ★★★★★
()
Последнее исправление: Dred (всего исправлений: 1)

А проверить?

#!/usr/bin/env python3

import time

def perf(fcn, count = 1000000):
    start = time.time()
    for i in range(count):
        fcn()
    end = time.time()
    print("%d runs in %f seconds (%f RPS)" % (count, end - start, count / (end - start)))

def printf():
    s = "%08x %s %d" % (666, "Hello, world!", 13)

def format():
    s = "{:>08x} {} {}".format(666, "Hello, world!", 13)

def format_pos():
    s = "{0:>08x} {1} {2}".format(666, "Hello, world!", 13)

def format_name():
    s = "{int1:>08x} {str} {int2}".format(int1 = 666, str = "Hello, world!", int2 = 13)

if __name__ == '__main__':
    perf(printf)
    perf(format)
    perf(format_pos)
    perf(format_name)

$ ./test.py 
1000000 runs in 0.345226 seconds (2896652.792194 RPS)
1000000 runs in 0.457409 seconds (2186227.659770 RPS)
1000000 runs in 0.475804 seconds (2101706.397764 RPS)
1000000 runs in 0.783848 seconds (1275758.243998 RPS)

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

rymis ★★
()
Ответ на: комментарий от Dred

Ну, воды очень много. Но пару вещей говорит очень толково. Их в нете и нет, а если есть, то поверхностно, без акцента. Взять документацию на основном сайте. Сухая инфа.

masterdilly
() автор топика
Ответ на: комментарий от Deleted

P.S. сам использую %, ибо как-то привык. Но лучше использовать format, наверное

Deleted
()
Ответ на: комментарий от rymis

Перечитал код. Надо бы добавить выборку def format_name через %, чтобы тест был полон. Можно увидеть законченный вариант?

masterdilly
() автор топика
Ответ на: комментарий от Deleted

новый способ форматирования строк, начиная с 3.6

Имхо убого сделали. Что за мания везде «сахар» лепить

Siado ★★★★★
()
Ответ на: комментарий от Siado

А мне, кстати, нравится. Что смущает больше всего — так то, что теперь уже как минимум 3 разных способа форматирования строк :)

Deleted
()
Ответ на: комментарий от Deleted

А мне, кстати, нравится.

Оно больше неудобств вносит. Нет явности. И дополнительная нагрузка на всякие IDE, от подсветки до рефакторинга.

Siado ★★★★★
()

По скорости эти два способа одинаковы. Я всегда использую .format(), даже в простых случаях. Почему? Ну во-первых, мне кажется, что через оператор % в питоне выглядит как-то чужеродно и хуже читается. Во-вторых, через .format() значительно гибче. Да, не всегда нужна эта гибкость, но иногда нужна, а человек всегда старается уменьшать энтропию — если хотя бы иногда необходимо использовать .format(), а его использование везде не имеет каких-либо явнях недостатков, то почему бы не использовать его везде и не плодить лишних сущностей?

И да, ты забыл про третий способ, появившийся то ли в 3.5 то ли 3.6 — format strings. Выглядит примерно так:

x = 1
y = 2
s = f"The x is {x}, and the y is {y}, their sum is {x + y}"
print(s)

Он самый удобный, но не годится, если требуется совместимость со старыми питонами.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)

format, вроде оператор % более стар.

kachan ★★
()
Ответ на: комментарий от Siado

Что за мания везде «сахар» лепить

Зато код укорачивается, да и подобная штука давно в PHP есть и никому не мешает, а наоборот)

Gargamel
()

There should be one-- and preferably only one --obvious way to do it.

Не напомните, какого языка сей зэн? Ах, ну конечно же. Того, у которого используется как минимум три форматтера для строки.

Аналогичная ситуация, кстати, и с читаемостью кода. Хотели как лучше, а получилось по-питонячьи.

anonymous
()
Ответ на: комментарий от Psych218

Можно было писать что-то вроде

x=1
y=2
"%(x)s %(y)s" % locals()
И раньше. Тоже не понимаю зачем этот сахар.

Ещё остался 'Hello '+world.

pawnhearts ★★★★★
()

Есть ещё f-строки с интерполяцией. Моё мнение такое:

f-строки использовать нельзя ни в каком виде. Они являются явнейший реализацией антипаттерна по смешиванию кода и данных, нечитаемы сами по себе, а со сколь либо сложными выражениеями становятся вообще адом, имеют проблемы с эскейпингом, несовместимы с локализацией, подсветкой синтаксиса и ещё бог весть чем.

% deprecated, тащит уродский ограниченный C'шный printf синтаксис

Остаётся .format, и он рулит.

slovazap ★★★★★
()
Ответ на: комментарий от RazrFalcon

' vs ".

Ещё есть

"""
и
'''

А в руби ещё больше конструкций.

pawnhearts ★★★★★
()
Ответ на: комментарий от slovazap

согласен с оратором. format() — это просто метод класса, органично вписывается в концепцию ООП. Всё остальное — неведомая хрень на постном масле :)

Sahas ★★★★☆
()
Ответ на: комментарий от Sahas

Именно так. Я не смог это так точно сформулировать :)

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Чётенько. То, что надо. Спасибо мил человек. Ну и Psych218 тоже. Нормально расписали.

masterdilly
() автор топика
Ответ на: комментарий от Dred

% - грозились выпилить, но этого не будет ибо его logging использует, да еще туча всякого легаси

Что-то Гвидо давно совместимость не ломал, пора исправить.

entefeed ☆☆☆
()
Ответ на: комментарий от man_of_motley

4.2 там написано не смешивать табы с пробелами, а использовать пробелы или табы в зависимости от того, как принято в проекте. И pep8 распространяется на стандартную библиотеку, в других проектах может быть другой стандарт.

pawnhearts ★★★★★
()
Ответ на: комментарий от man_of_motley

Конкретно этот пункт pep8 всегда шлю подальше. Только табы, только хардкор.

(Ну если конечно ещё до меня какая нибудь сволочь не испортила код пробелами).

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)

В своем каталоге «~/Projects» можешь использовать, что хочешь. В на работе тебе вручат style guide, и будешь использовать то, что выбрали за тебя, иначе получишь по сопатке с вертушки.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Sahas

Питон — не онли ООП. А .format из Джавы притащили.

Virtuos86 ★★★★★
()

Лучше всего %, конечно же, потому что использует стандартные, printf-совместимые спецификаторы формата, а не собственные доморощенные изобретения. f'str' лучше никогда не использовать, потому что это PHP-стиль и огромная дыра в безопасности.

Deleted
()
Ответ на: комментарий от Deleted

Например?

Дочитай коммент до конца, там же и пример.

Siado ★★★★★
()
Ответ на: комментарий от Gargamel

Зато код укорачивается, да и подобная штука давно в PHP есть и никому не мешает, а наоборот)

Приводить PHP в пример это как приводить в пример жигули, когда разговариваешь про суперкары =)

Siado ★★★★★
()
Ответ на: комментарий от RazrFalcon

Что за мания везде «сахар» лепить

Питон же.

В питоне, как-раз, сахара минимум по сравнению с другими языками, но все равно его туда залепить при каждом удобном случае пытаются.

Siado ★★★★★
()
Ответ на: комментарий от Siado

Ты что-то путаешь. В Расте синтаксиса больше, чем в питоне, что не удивительно, хотя бы потому, что Раст — статически типизированный ЯП, в отличие от, что влечет необходимость проставлять аннотации типов. Но «сахарок» там только недавно стали добавлять понемногу.

Virtuos86 ★★★★★
()

% - на тривиальном '%s' % 'blah' оно чуточку быстрее чем .format (для % нужна всего одна инструкция в байт-коде, а .format это вызов метода, там больше инструкций), впрочем на чем-то большем чем тривиальный '%s' разница не заметна вообще... а ещё у него есть подводный камень с разворачиванием переданного тупла там, где ожидался один скаляр

.format - нет подводного камня с tuple, больше фич по форматированию, но не так удобно как %

Formatted string literals (из первого коммента) - стильно, модно, молодежно, 3.6+

ei-grad ★★★★★
()
Последнее исправление: ei-grad (всего исправлений: 1)
Ответ на: комментарий от masterdilly

Легко: взять и дописать. На все это я потратил 3 минуты с чтением help'а по методам строки в отдельной вкладке терминала.

rymis ★★
()
Ответ на: комментарий от pawnhearts

Я не настоящий сварщик: Питон для меня очень полезный инструмент для выполнения маленьких задачек, поэтому я часто забываю что там есть в стандартной библиотеке. Конечно лучше использовать timeit.

rymis ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.