Que significa error TypeError: 'NoneType' object is not iterable
?
Lo estoy obteniendo en este código de Python:
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)
None
se coacciona como secuencia, debe producir una secuencia vacía, totalmente inofensiva.None
nunca es forzado a nada . Tener unNone
comportamiento silencioso como otros tipos oculta errores; eso es lo contrario de "inofensivo". Si necesita un marcador de posición falso para la secuencia vacía, puede usar()
o''
/""
, los cuales son singletons y se pueden cargar tan barato como sea posibleNone
. Si desea optar por tratar silenciosamente cualquier cosa falsa como una secuencia vacía, puede hacerlofor row in data or ():
, pero nadie lo hace, porque pasarNone
a una función que espera una secuencia es un error que no debe pasar en silencio.Respuestas:
Significa el valor de
data
esNone
.fuente
for
bucle en lugar de generar una excepción. El diseño de Python es defectuoso aquí. CuandoNone
se trata como iterable, debe devolver al menos una lista vacía. Esta excepción nunca ayudó a nadie en la vida real, aparte de hacernos insertar unif data is not None:
tipo de manejo feo .fieldlist
para elDictWriter
esNone
!for i in data or []
data
es o noNone
, sino dejar que ocurra la excepción. Usted quiere los consumidores de su API para saber cuando se ha usado de manera incorrecta. AceptarNone
como una secuencia vacía permitiría que errores comomylist = mylist.extend(morestuff)
, logren esconderse aún más; piensan que editaronextend
unlist
(y lo hicieron, pero luego lo reemplazaron de inmediatoNone
), luego lo pasaron a la función del OP y se preguntan por qué el archivo está vacío, sin que se generen errores de ningún tipo.Explicación del error: el objeto 'NoneType' no es iterable
En python2, NoneType es el tipo de Ninguno. En Python3 NoneType es la clase de Ninguno, por ejemplo:
Iterar sobre una variable que tiene valor Ninguno falla:
Los métodos de Python devuelven NoneType si no devuelven un valor:
Debe verificar sus construcciones de bucle para NoneType como este:
Guido dice que solo se usa
is
para verificarNone
porqueis
es más robusto para la verificación de identidad. No use operaciones de igualdad porque pueden escupir su propia implementación de burbujas. Pautas de estilo de codificación de Python - PEP-008NoneTypes son furtivos y pueden colarse de lambdas:
NoneType no es una palabra clave válida:
Concatenación de
None
y una cadena:¿Que está pasando aqui?
El intérprete de Python convirtió su código a pyc bytecode. La máquina virtual de Python procesó el código de bytes, encontró una construcción en bucle que dijo iterar sobre una variable que contenía None. La operación se realizó invocando el
__iter__
método en Ninguno.Ninguno no tiene un
__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 mecanografía de pato de Python ideología de se considera mala. El programador hace algo completamente razonable con una variable y en el tiempo de ejecución se contamina con None, la máquina virtual de Python intenta continuar, y vomita un montón de tonterías no relacionadas por toda la alfombra.
Java o C ++ no tienen estos problemas porque no se permitiría compilar un programa de este tipo, ya que no ha definido qué hacer cuando ocurre Ninguno. Python le da al programador mucha soga para ahorcarse permitiéndole hacer muchas cosas que no se debe esperar que funcionen en circunstancias excepcionales. Python es un sí, dice sí, señor, cuando te impide detenerte, como lo hacen Java y C ++.
fuente
NoneType
yNone
(b) piensa queNameError: name 'NoneType' is not defined
yTypeError: cannot concatenate 'str' and 'NoneType' objects
son lo mismo queTypeError: 'NoneType' object is not iterable
(c) la comparación entre Python y Java es "un montón de tonterías no relacionadas"null
a una función esperando cualquier tipo de colección. C ++ tendría el mismo problema (pero en general solo moriría en una falla por defecto sin informar la causa) paranullptr
(es cierto que C ++ bueno rara vez usa punteros, pero lo que ha demostrado es Python malo, y C ++ malo también puede morir en tiempo de ejecución por nulos) . Python está haciendo lo correcto aquí; no es "seguir adelante", está fallando en el momento en que intentas usarNone
para algoNone
que no puedes hacer. Su problema no es con Python, es con lenguajes dinámicamente escritos en general.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
ydata
. Enfor row in data
, ¿cuál debe ser iterable? Solamentedata
.¿Cuál es el problema con
data
? Su tipo esNoneType
. SoloNone
tiene tipoNoneType
. Entoncesdata is None
.Puede verificar esto en un IDE, o insertando, por ejemplo,
print "data is", repr(data)
antes de lafor
declaración, y volviendo a ejecutar.Piense en lo que debe hacer a continuación: ¿Cómo se debe representar "sin datos"? ¿Escribimos un archivo vacío? ¿Presentamos una excepción o registramos una advertencia o nos quedamos en silencio?
fuente
Otra cosa que puede producir este error es cuando está configurando algo igual al retorno de una función, pero se olvidó de devolver cualquier cosa.
Ejemplo:
Este es un error un poco difícil de detectar porque el error también se puede producir si la variable de fila es Ninguno en una de las iteraciones. La forma de detectarlo es que la traza falla en la última línea y no dentro de la función.
Si solo devuelve una variable de una función, no estoy seguro de si se producirá el error ... Sospecho que el error "El objeto 'NoneType' no es iterable en Python" en este caso en realidad implica "Hey, estoy intentando iterar sobre los valores de retorno para asignarlos a estas tres variables en orden, pero solo obtengo None para iterar "
fuente
Significa que la variable de datos está pasando None (que es type NoneType), su equivalente para nada . Por lo tanto, no puede ser iterable como una lista, como está tratando de hacer.
fuente
for row in data or []:
Estás llamando a write_file con argumentos como este:
Pero no ha definido 'foo' correctamente, o tiene un error tipográfico en su código para que esté creando una nueva variable vacía y pasándola.
fuente
Para mí fue un caso de tener mi sombrero Groovy puesto en lugar del Python 3.
Olvidé la
return
palabra clave al final de unadef
función.No había estado codificando Python 3 en serio durante un par de meses. Estaba pensando que la última declaración evaluada en la rutina se devolvía de la manera Groovy.
Tomó algunas iteraciones, observando el seguimiento de la pila, insertando la
try: ... except TypeError: ...
depuración de bloque / paso a través del código para descubrir qué estaba mal.La solución para el mensaje ciertamente no hizo que el error saltara sobre mí.
fuente