TypeError: unsupported operand type(s) for %: 'NoneType' and 'str'

user3586591 picture user3586591 · Apr 29, 2014 · Viewed 66.4k times · Source

So I am VERY new to programming and I started with Python 3. I started reading "Learn Python the Hard Way". Now, I got to a point where I had this code:

x = "There are %d types of people." % 10
binary = "binary"
do_not = "don't"
y = "Those who know %s and those who %s" % (binary, do_not)

print(x)
print(y)
print("I said: %r") % x

I do not really know the difference between %r, %s and %d. The error I get is TypeError: unsupported operand type(s) for %: 'NoneType' and 'str' No idea what to do and how to fix it. Please explain how I can actually make it work and why it won't work. Also, what is the difference between %r,d and s? Any useful links? Thank you in advance.

Answer

Martijn Pieters picture Martijn Pieters · Apr 29, 2014

You want to apply % to the string instead:

print("I said: %r" % x)

Your code is applying it to the return value of the print() call, which returns None.

Alternatively, you can switch to using str.format():

print("I said: {!r}".format(x))