Saltar al contenido

TypeError: el objeto ‘NoneType’ no es iterable en Python

octubre 21, 2021
apple touch icon@2

Explicación del error: el objeto ‘NoneType’ no es iterable

En python2, NoneType es el tipo de None. En Python3 NoneType es la clase de None, por ejemplo:

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

La iteración sobre una variable que tiene valor Ninguno falla:

for a in None:
    print("k")     #TypeError: 'NoneType' object is not iterable

Los métodos de Python devuelven NoneType si no devuelven un valor:

def foo():
    print("k")
a, b = foo()      #TypeError: 'NoneType' object is not iterable

Debe verificar sus construcciones de bucle para NoneType de esta manera:

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 dice que solo use is para comprobar None porque is es más robusto para la verificación de identidad. No use operaciones de igualdad porque pueden escupir implementaciones de burbujas por sí mismas. Pautas de estilo de codificación de Python – PEP-008

Ninguno Los tipos son furtivos y pueden colarse desde lambdas:

import sys
b = lambda x : sys.stdout.write("k") 
for a in b(10): 
    pass            #TypeError: 'NoneType' object is not iterable 

NoneType no es una palabra clave válida:

a = NoneType     #NameError: name 'NoneType' is not defined

Concatenación de None y una cuerda:

bar = "something"
foo = None
print foo + bar    #TypeError: cannot concatenate 'str' and 'NoneType' objects

¿Que está pasando aqui?

El intérprete de Python convirtió su código a código de bytes pyc. La máquina virtual Python procesó el código de bytes, encontró una construcción de bucle que decía iterar sobre una variable que contenía Ninguno. La operación se realizó invocando el __iter__ método en Ninguno.

Ninguno tiene ningún __iter__ método definido, por lo que la máquina virtual de Python le dice lo que ve: que NoneType no tiene __iter__ método.

Esta es la razón por Tipeo de pato de Python la ideología se considera mala. El programador hace algo completamente razonable con una variable y, en tiempo de ejecución, se contamina con None, la máquina virtual de Python intenta seguir adelante y vomita un montón de tonterías no relacionadas por toda la alfombra.

Java o C ++ no tienen estos problemas porque un programa de este tipo no podría compilar ya que no ha definido qué hacer cuando se produce None. Python le da al programador mucha cuerda para ahorcarse al permitirle hacer muchas cosas que no deberían funcionar en circunstancias excepcionales. Python es un sí-hombre, diciendo que sí-señor cuando intenta evitar que te lastimes, como lo hacen Java y C ++.

close