Python TypeError: non-empty format string passed to object.format

I hit this TypeError exception recently, which I found very difficult to debug. I eventually reduced it to this small test case:

    >>> "{:20}".format(b"hi")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: non-empty format string passed to object.__format__

This is very non-obvious, to me anyway. The workaround for my code was to decode the byte string into unicode:

     >>> "{:20}".format(b"hi".decode("ascii"))
     'hi                  '

What is the meaning of this exception? Is there a way it can be made more clear?

bytes objects do not have a __format__ method of their own, so the default from object is used:

    >>> 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__

It just means that you cannot use anything other than straight up, unformatted unaligned formatting on these. Explicitly convert to a string object (as you did by decoding bytes to str) to get format spec support.

You can make the conversion explicit by using the !s string conversion:

    >>> '{!s:20s}'.format(b"Hi")
    "b'Hi'               "
    >>> '{!s:20s}'.format(object())
    '<object object at 0x1100b9080>'

object.__format__ explicitly rejects format strings to avoid implicit string conversions, specifically because formatting instructions are type specific.

From: stackoverflow.com/q/24170519