Уведомления

Группа в Telegram: @pythonsu

#1 Март 30, 2021 21:54:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

str.format

Rodegast
Кто тебе запрещает использовать имена в месте с %?
Напиши то же самое через процент, что я написал выше через str.format().

Rodegast
 "aaaaa {}".format("bbb")
  
>>> 'aaaaa %s' % 'bbb'
'aaaaa bbb'
>>> 'aaaaa %s' % 1
'aaaaa 1'
>>> 'aaaaa %s' % 1+1j
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not complex
>>> 
>>> 
>>> 'aaaaa {}'.format('bbb')
'aaaaa bbb'
>>> 'aaaaa {}'.format(1)
'aaaaa 1'
>>> 'aaaaa {}'.format(1+1j)
'aaaaa (1+1j)'
>>>



Офлайн

#2 Март 30, 2021 22:07:29

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

str.format

> Напиши то же самое через процент, что я написал выше через str.format().

 >>> 'User: %(user)s, Address: %(address)s, Phone: %(phone)i'%{"user": "John", "address": "msk", "phone": 123}
'User: John, Address: msk, Phone: 123'

>>> ‘aaaaa %s’ % ‘bbb’

Сколько же раз нужно объяснять что для канкатинации есть оператор +?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Март 30, 2021 23:53:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

str.format

Rodegast
> Напиши то же самое через процент, что я написал выше через str.format().
  
>>> 'User: %(user)s, Address: %(address)s, Phone: %(phone)i'%{"user": "John", "address": "msk", "phone": 123}
'User: John, Address: msk, Phone: 123'
Неа, не работает
  
>>> '%(phone)i' % {'phone': 555}
'555'
>>> '%(phone)i' % {'phone': '555-55-55'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %i format: a number is required, not str
>>>

А так работает
  
>>> '{phone}'.format(phone='555-55-55')
'555-55-55'
>>> '{phone}'.format(phone=555)
'555'
>>>

Я ничего не менял, это ты просто не заметил такую штучку, которую я там вставил специально, чтобы ты на неё попался

Rodegast
Сколько же раз нужно объяснять что для канкатинации есть оператор +?
В конце что-то присоединить - это слишком частный случай. Я таким пользуюсь чаще всего, когда сообщения об ошибках составляю. Да и то, это только потому, что они имеют стандартную форму “progname: error: message: details” , когда постепенно всё присоединяешь. В остальных 90% случаев конкатенация не катит, потому что плюсики в середине начинают просто мешать. Чтобы добавить/удалить одно новое/старое слово, нужно кучу плюсов вставлять/удалять и выравнивать потом это всё.



Отредактировано py.user.next (Март 31, 2021 00:00:22)

Офлайн

#4 Март 31, 2021 09:11:59

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

str.format

Rodegast
Сколько же раз нужно объяснять что для канкатинации есть оператор +?
конкатенация заметно медленне всего остального изза того что строки неизменяемый тип. На простых примерах типа ‘Hello’ + ‘World’ оно работает, Но на сложных - можна добиться ускорения в десятки-сотни раз заменив конкатенацию на format, % или f-строки.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Март 31, 2021 12:18:50

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

str.format

> Неа, не работает

И очень хорошо что не работает ибо проверку типов ничто не отменяет.

> В конце что-то присоединить - это слишком частный случай

Я с этим случаем периодически сталкиваюсь.

> конкатенация заметно медленне всего остального

Так было лет 10 назад, сейчас оно +/- одинаково работает.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 31, 2021 12:22:11)

Офлайн

#6 Март 31, 2021 23:48:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

str.format

Rodegast
И очень хорошо что не работает ибо проверку типов ничто не отменяет.
В том-то и дело, что мне не нужна проверка типов. Но также я могу её включить, указав спецификатор конкретно.

Да и был пеп на этот счёт. Были даже обсуждения в списке рассылок в 2006-м году.

https://www.python.org/dev/peps/pep-3101/
The ‘%’ operator is primarily limited by the fact that it is a binary operator, and therefore can take at most two arguments. One of those arguments is already dedicated to the format string, leaving all other variables to be squeezed into the remaining argument. The current practice is to use either a dictionary or a tuple as the second argument, but as many people have commented , this lacks flexibility. The “all or nothing” approach (meaning that one must choose between only positional arguments, or only named arguments) is felt to be overly constraining.

Обсуждения плюсов и минусов процента
https://mail.python.org/pipermail/python-3000/2006-April/thread.html#331

Так что ты не можешь повторить то, что я выше написал, из-за ограничений, которые есть у процента. Просто не можешь.

К тому же формат даёт то преимущество, что его спецификаторы можно переопределить. Ты знаешь об этом?

Вот пример переопределённого формата для типа datetime.datetime
  
>>> import datetime
>>> 
>>> 'Today is {:%d %b %Y}'.format(datetime.datetime.now())
'Today is 01 Apr 2021'
>>>

А вот пример переопределённого формата для своего целочисленного типа
  
>>> class Int(int):
...     def __format__(self, spec):
...         if spec.startswith('^'):
...             return str(self ** int(spec[1:]))
...         else:
...             return super().__format__(spec)
... 
>>> n = Int(5)
>>> n
5
>>> '{} {:d} {:^2} {:^3}'.format(n, n, n, n)
'5 5 25 125'
>>>


tags: format



Отредактировано py.user.next (Апрель 1, 2021 00:05:26)

Офлайн

#7 Апрель 1, 2021 12:19:55

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

str.format

> Так что ты не можешь повторить то, что я выше написал, из-за ограничений, которые есть у процента. Просто не можешь.

Ты наверное просто скудоумный если думаешь что я не смогу привести тип значения к строке

> К тому же формат даёт то преимущество, что его спецификаторы можно переопределить.

Все эти переопределения с отсутствием контроля типов могут только вызвать проблемы.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Апрель 1, 2021 12:53:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

str.format

Rodegast
Ты наверное просто скудоумный если думаешь что я не смогу привести тип значения к строке

Ну, вот ты написал
Rodegast
  
>>> 'User: %(user)s, Address: %(address)s, Phone: %(phone)i'%{"user": "John", "address": "msk", "phone": 123}
'User: John, Address: msk, Phone: 123'
И как ты будешь приводить к строке? В том-то и дело, что никак. Всё надо переделывать только из-за этого процента. А мне вот не надо ничего переделывать и приводить ничего не надо. Так что пока ты будешь переделывать что-то там в очередной раз, какую-нибудь мелочь, я уже буду вторую программу писать, потому что первая у меня уже будет вся написана.

Rodegast
Все эти переопределения
Обычное переопределение магического метода. Что тебя так пугает в этом, не знаю. Наверное, неуверенность в том, что у тебя получится в итоге. Надо больше писать просто, чтобы опыт придавал уверенности.



Офлайн

#9 Апрель 1, 2021 21:44:43

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

str.format

> И как ты будешь приводить к строке? В том-то и дело, что никак.

Что же ты такое не сообразительный…

 >>> [
... 'User: %(user)s, Address: %(address)s, Phone: %(phone)s'%{"user": str(x), "address": str(y), "phone": str(z)}
... for x, y, z in  [('John', 'Street 123', 123),('Bob', 'Street 789', '555-55-55')]
... ]
['User: John, Address: Street 123, Phone: 123', 'User: Bob, Address: Street 789, Phone: 555-55-55']

> Обычное переопределение магического метода

Но оно же переопределено для данных конкретного типа. Кто может дать гарантию что не придут данные для которых эта хрень не определена каким то неожиданным образом.
Ты наверное в больших проектах не участвовал, по этому подобных вещей не понимаешь.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#10 Апрель 1, 2021 23:07:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

str.format

Rodegast
Что же ты такое не сообразительный…
  
>>> [
... 'User: %(user)s, Address: %(address)s, Phone: %(phone)s'%{"user": str(x), "address": str(y), "phone": str(z)}
... for x, y, z in  [('John', 'Street 123', 123),('Bob', 'Street 789', '555-55-55')]
... ]
['User: John, Address: Street 123, Phone: 123', 'User: Bob, Address: Street 789, Phone: 555-55-55']
Это ты хочешь сказать, что это лучше короткого str.format()?
То есть фактически ты пишешь обёртку, которая приводит все типы вместо процента, потому что процент их приводить не умеет. Ну, молодец чо. Так ты ещё и свёл всё к %s в форматной строке, откинув все чудесные возможности процента по заданию определённых типов. А мне вот одного формата хватает один раз написанного и всё, и он всё приводит сам. И если у объекта есть его нативное строковое представление, то он так и выведется сразу. Мне не нужно для этого ничего дописывать. Оно там внутри само разпознается. В этом сила полиморфизма.

Rodegast
Кто может дать гарантию что не придут данные для которых эта хрень не определена каким то неожиданным образом.
Ты наверное в больших проектах не участвовал, по этому подобных вещей не понимаешь.
Я думаю, ты не знаешь, что такое полиморфизм, как им пользоваться, для чего он нужен, что он даёт и почему его нужно использовать. Вот в этом вся твоя проблема. Ты думал, что он поймётся как-то сам, из космоса, а для этого, на самом деле, надо книжки читать обязательно. Поэтому твоё окружение, такое же, оно точно так же не знает, что такое полиморфизм, потому что вы учитесь друг у друга, а книжек никто из вас не читал. В итоге вы все нихера не знаете. А когда вы все нихера не знаете, у вас ничего не получается родить. В итоге ваш “большой проект”, он большой только по количеству строк. Но это количество строк ничего не делает по своей сути. А ты думал, что это всё никому не нужно? Так это не нужно тем, кто нихера не делает, не производит ничего.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version