Ответ 1
bytes
объекты не имеют собственного метода __format__
, поэтому используется значение по умолчанию от object
:
>>> bytes.__format__ is object.__format__
True
>>> '{:20}'.format(object())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__
Это просто означает, что вы не можете использовать ничего, кроме прямого, неформатированного негласного форматирования на них. Явно конвертируем в строковый объект (как вы это сделали, расшифровывая bytes
до str
), чтобы получить поддержку спецификации формата.
Вы можете сделать преобразование явным с помощью преобразования строки !s
:
>>> '{!s:20s}'.format(b"Hi")
"b'Hi' "
>>> '{!s:20s}'.format(object())
'<object object at 0x1100b9080>'
object.__format__
явно отклоняет строки форматирования, чтобы избежать неявных преобразований строк, особенно потому, что инструкции форматирования специфичны по типу.