Solución:
Significa el valor de data
es None
.
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 el Ninguno.
Ninguno tiene __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 la que la ideología del tipo de pato de Python 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 se espera que funcionen 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 ++.
Código: for row in data:
Mensaje de error: TypeError: 'NoneType' object is not iterable
¿De qué objeto se queja? Elección de dos, row
y data
. En for row in data
, que necesita ser iterable? Solamente data
.
Cual es el problema con data
? Su tipo es NoneType
. Solamente None
tiene tipo NoneType
. Entonces data is None
.
Puede verificar esto en un IDE, o insertando, por ejemplo, print "data is", repr(data)
antes de for
declaración y volver a ejecutar.
Piense en lo que debe hacer a continuación:
¿Cómo se debe representar “sin datos”? ¿Escribimos un archivo vacío? ¿Generamos una excepción, registramos una advertencia o nos quedamos en silencio?