78

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?

3
  • 8
    Probably worth noting: this only became a TypeError in Python 3.4+, and it affects anything that inherits from object without defining __format__ along the way (e.g. None; class T(object): pass, etc.). Commented Jul 8, 2014 at 13:54
  • 1
    For background information see bugs.python.org/issue7994 Commented Mar 19, 2015 at 23:25
  • 2
    I had this problem too, finally found out that a variable that should have contained a float, actually contained None. Thus '{0:.4f}'.format(bla) caused this exception Commented May 27, 2018 at 7:39

2 Answers 2

79

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.

Sign up to request clarification or add additional context in comments.

1 Comment

makes sense, thanks! I wish the error were more intuitive though!
27

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)!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.