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?
The __format__() method is used by string. format() as well as the format() built-in function. Both of these interfaces are used to get presentable string versions of a given object.
Formatters work by fixing one or a lot of replacement fields or placeholders outlined by a pair of curled brackets “{}” — into a string and calling the str. format() technique. You'll pass into the format() method the value you wish to concatenate with the string.
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.
This also happens when trying to format None
:
>>> '{:.0f}'.format(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__
That took a moment to work out (in my case, when None
was being returned by an instance variable)!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With