Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: 'NoneType' object is not iterable in Python

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) 
like image 526
Alex Gordon Avatar asked Oct 08 '10 02:10

Alex Gordon


People also ask

How do I fix NoneType object is not iterable in Python?

The error “TypeError: 'NoneType' object is not iterable” occurs when you try to iterate over a NoneType object. Objects like list, tuple, and string are iterables, but not None. To solve this error, ensure you assign any values you want to iterate over to an iterable object.

How do you fix TypeError argument of type NoneType is not iterable?

The Python "TypeError: argument of type 'NoneType' is not iterable" occurs when we use the membership test operators (in and not in) with a None value. To solve the error, correct the assignment of the variable that stores None or check if it doesn't store None .

What does TypeError NoneType object is not iterable?

The Python "TypeError: 'NoneType' object is not iterable" occurs when we try to iterate over a None value. To solve the error, figure out where the variable got assigned a None value and correct the assignment or check if the variable doesn't store None before iterating.

How can we avoid TypeError NoneType object is not iterable?

One way to avoid this error is to check before iterating on an object if that object is None or not. In addition, another way to handle this error: Python nonetype object is not iterable is to write the for loop in try-except block. Thirdly, it is to explicitly assign an empty list to the variable if it is None .


2 Answers

It means the value of data is None.

like image 63
vanza Avatar answered Sep 22 '22 11:09

vanza


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:

>>> print(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. 

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 None because 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 

Concatenation of 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 __iter__ method.

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.

like image 29
Eric Leschinski Avatar answered Sep 23 '22 11:09

Eric Leschinski