TGViewer
Python Заметки Python Заметки @pythonotes · 2.2K subscribers
Post #11 420
Есть такая запись форматирования

>>> "{0:>10}".format(42)
" 42"

Что означает: сделать строку шириной 10 символов и переданный аргумент выровнять по правую сторону.
Есть аналог для перемещения влево и по центру, но не об этом сейчас.
Что будет, если подать в такую строку кастомный класс?

>>> class MyClass:
>>> pass

>>> c = MyClass()
>>> "{0:>10}".format(c)
TypeError: unsupported format string passed to MyClass.__format__

Упс, ошибка форматирования! То есть Python говорит что у нашего класса нет метода ˍˍformatˍˍ. Даже ˍˍstrˍˍ и ˍˍreprˍˍ не помогут.

>>> class MyClass:
>>> def __str__(self):
>>> return 'My Class'
>>> def __repr__(self):
>>> return '<My Class>'
>>> c = MyClass()
>>> "{0:>20}".format(c)
TypeError: unsupported format string passed to MyClass.__format__

Что ж, это легко решается добавлением метода ˍˍformatˍˍ. Но а что если это не ваши классы и изменить исходники никак нельзя? Можно сделать небольшое преобразование, например такими способами:

>>> "{0:>20}".format(str(c))
" My Class"
>>> "{0:>20}".format(repr(c))
" <My Class>"

Но лучше использовать явный конвертор, то есть механизмы самого форматирования. В таком случае необходимое действия будет жёстко указано в самом паттерне.
Чтобы "конвертнуть" свой класс с помощью ˍˍstrˍˍ пишем так:

"{0!s:>20}".format(c)

А чтобы преобразование сделалось с помощью ˍˍreprˍˍ, пишем так:

"{0!r:>20}".format(c)

Теперь не важно какой класс прилетит, всё сработает!
Только учтите, если не определить методы ˍˍstrˍˍ и ˍˍreprˍˍ то получится что-то типа:

"<MyClass object at 0x7f27a62ed278>"

Но хотя бы не будет ошибки.

PS. А если определить метод ˍˍformatˍˍ, то можно и другие буковки использовать для специфичных преобразований!

#tricks
More from @pythonotes
  1. Sep 21, 2026­ WebAssembly это мощная технология позволяющая загружать практически любое приложение в б…
  2. Aug 17, 2026Не так давно столкнулся с API который в ответе с ошибкой присылал только статус-код. Без п…
  3. Jul 20, 2026У меня основная ОС это Linux. Но нередко требуется делать сборку клиента под Windows. Соби…
  4. Jul 13, 2026В прошлый раз был пример с понижением привелегий процесса. Проблема в том, что обратно под…
  5. Jul 6, 2026Модуль pwd может использоваться для считывания информации о пользователях из базы данных п…
  6. Jun 22, 2026Недавно я реализовал Multi Tenancy систему на FastAPI + SQLAlchemy и пересобрал её в небол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →