What does error
TypeError: 'NoneType' object is not iterable mean?
I am getting it on this Python code:
def write_file(data, filename): # creates file and writes list to it with open(filename, 'wb') as outfile: writer = csv.writer(outfile) for row in data: # ABOVE ERROR IS THROWN HERE writer.writerow(row)
It means the value of
Explanation of error: ‘NoneType’ object is not iterable
In python2, NoneType is the type of None. In Python3 NoneType is the class of None, for example:
type(None)) #Python2 <type 'NoneType'> #In Python2 the type of None is the 'NoneType' type. print(type(None)) #Python3 <class 'NoneType'> #In Python3, the type of None is the 'NoneType' class.print(
Iterating over a variable that has value None fails:
for a in None: print("k") #TypeError: 'NoneType' object is not iterable
Python methods return NoneType if they don’t return a value:
def foo(): print("k") a, b = foo() #TypeError: 'NoneType' object is not iterable
You need to check your looping constructs for NoneType like this:
a = None print(a is None) #prints True print(a is not None) #prints False print(a == None) #prints True print(a != None) #prints False print(isinstance(a, object)) #prints True print(isinstance(a, str)) #prints False
Guido says only use
is to check for
is is more robust to identity checking. Don’t use equality operations because those can spit bubble-up implementationitis of their own. Python’s Coding Style Guidelines – PEP-008
NoneTypes are Sneaky, and can sneak in from lambdas:
import sys b = lambda x : sys.stdout.write("k") for a in b(10): pass #TypeError: 'NoneType' object is not iterable
NoneType is not a valid keyword:
a = NoneType #NameError: name 'NoneType' is not defined
None and a string:
bar = "something" foo = None print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
What’s going on here?
Python’s interpreter converted your code to pyc bytecode. The Python virtual machine processed the bytecode, it encountered a looping construct which said iterate over a variable containing None. The operation was performed by invoking the
__iter__ method on the None.
None has no
__iter__ method defined, so Python’s virtual machine tells you what it sees: that NoneType has no
This is why Python’s duck-typing ideology is considered bad. The programmer does something completely reasonable with a variable and at runtime it gets contaminated by None, the python virtual machine attempts to soldier on, and pukes up a bunch of unrelated nonsense all over the carpet.
Java or C++ doesn’t have these problems because such a program wouldn’t be allowed to compile since you haven’t defined what to do when None occurs. Python gives the programmer lots of rope to hang himself by allowing you to do lots of things that should cannot be expected to work under exceptional circumstances. Python is a yes-man, saying yes-sir when it out to be stopping you from harming yourself, like Java and C++ does.
for row in data:
TypeError: 'NoneType' object is not iterable
Which object is it complaining about? Choice of two,
for row in data, which needs to be iterable? Only
What’s the problem with
data? Its type is
None has type
data is None.
You can verify this in an IDE, or by inserting e.g.
print "data is", repr(data) before the
for statement, and re-running.
Think about what you need to do next:
How should “no data” be represented? Do we write an empty file? Do we raise an exception or log a warning or keep silent?
Another thing that can produce this error is when you are setting something equal to the return from a function, but forgot to actually return anything.
def foo(dict_of_dicts): for key, row in dict_of_dicts.items(): for key, inner_row in row.items(): Do SomeThing #Whoops, forgot to return all my stuff return1, return2, return3 = foo(dict_of_dicts)
This is a little bit of a tough error to spot because the error can also be produced if the row variable happens to be None on one of the iterations. The way to spot it is that the trace fails on the last line and not inside the function.
If your only returning one variable from a function, I am not sure if the error would be produced… I suspect error “‘NoneType’ object is not iterable in Python” in this case is actually implying “Hey, I’m trying to iterate over the return values to assign them to these three variables in order but I’m only getting None to iterate over”
It means that the data variable is passing None (which is type NoneType), its equivalent for nothing. So it can’t be iterable as a list, as you are trying to do.
You’re calling write_file with arguments like this:
But you haven’t defined ‘foo’ correctly, or you have a typo in your code so that it’s creating a new empty variable and passing it in.
For me it was a case of having my Groovy hat on instead of the Python 3 one.
return keyword at the end of a
Had not been coding Python 3 in earnest for a couple of months. Was thinking last statement evaluated in routine was being returned per the Groovy (or Rust) way.
Took a few iterations, looking at the stack trace, inserting
try: ... except TypeError: ... block debugging/stepping thru code to figure out what was wrong.
The solution for the message certainly did not make the error jump out at me.
Just continue the loop when you get None Exception,
a = None if a is None: continue else: print("do something")
This can be any iterable coming from DB or an excel file.