Найти - Пользователи
Полная версия: str.format
Начало » Python для новичков » str.format
1 2 3
py.user.next
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)'
>>>
Rodegast
> Напиши то же самое через процент, что я написал выше через 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’

Сколько же раз нужно объяснять что для канкатинации есть оператор +?
py.user.next
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% случаев конкатенация не катит, потому что плюсики в середине начинают просто мешать. Чтобы добавить/удалить одно новое/старое слово, нужно кучу плюсов вставлять/удалять и выравнивать потом это всё.
PEHDOM
Rodegast
Сколько же раз нужно объяснять что для канкатинации есть оператор +?
конкатенация заметно медленне всего остального изза того что строки неизменяемый тип. На простых примерах типа ‘Hello’ + ‘World’ оно работает, Но на сложных - можна добиться ускорения в десятки-сотни раз заменив конкатенацию на format, % или f-строки.
Rodegast
> Неа, не работает

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

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

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

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

Так было лет 10 назад, сейчас оно +/- одинаково работает.
py.user.next
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
Rodegast
> Так что ты не можешь повторить то, что я выше написал, из-за ограничений, которые есть у процента. Просто не можешь.

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

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

Все эти переопределения с отсутствием контроля типов могут только вызвать проблемы.
py.user.next
Rodegast
Ты наверное просто скудоумный если думаешь что я не смогу привести тип значения к строке

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

Rodegast
Все эти переопределения
Обычное переопределение магического метода. Что тебя так пугает в этом, не знаю. Наверное, неуверенность в том, что у тебя получится в итоге. Надо больше писать просто, чтобы опыт придавал уверенности.
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']

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

Но оно же переопределено для данных конкретного типа. Кто может дать гарантию что не придут данные для которых эта хрень не определена каким то неожиданным образом.
Ты наверное в больших проектах не участвовал, по этому подобных вещей не понимаешь.
py.user.next
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
Кто может дать гарантию что не придут данные для которых эта хрень не определена каким то неожиданным образом.
Ты наверное в больших проектах не участвовал, по этому подобных вещей не понимаешь.
Я думаю, ты не знаешь, что такое полиморфизм, как им пользоваться, для чего он нужен, что он даёт и почему его нужно использовать. Вот в этом вся твоя проблема. Ты думал, что он поймётся как-то сам, из космоса, а для этого, на самом деле, надо книжки читать обязательно. Поэтому твоё окружение, такое же, оно точно так же не знает, что такое полиморфизм, потому что вы учитесь друг у друга, а книжек никто из вас не читал. В итоге вы все нихера не знаете. А когда вы все нихера не знаете, у вас ничего не получается родить. В итоге ваш “большой проект”, он большой только по количеству строк. Но это количество строк ничего не делает по своей сути. А ты думал, что это всё никому не нужно? Так это не нужно тем, кто нихера не делает, не производит ничего.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB