Pregunta

¿Qué significa TypeError: 'NoneType' object is not iterable error?

Me estoy haciendo en este código 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)
¿Fue útil?

Solución

Esto significa que el valor de data es None.

Otros consejos

Explicación de error: objeto 'NoneType' no es iterable

En python2, NoneType es el tipo de Ninguno. En python3 NoneType es la clase de Ninguna, 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.

interactuando sobre una variable que tiene un valor Ninguno falla:

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

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

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

Es necesario comprobar sus construcciones de bucle para NoneType como esto:

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 sólo el uso is para comprobar si hay None porque is es más robusto para la comprobación de la identidad. No utilice operaciones de igualdad ya los que pueden escupir burbujas en marcha implementationitis de los suyos. Directrices estilo de codificación de Python - PEP-008

NoneTypes son disimulado, y pueden colarse en lambdas de:

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

La concatenación de None y una cadena:

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

¿Qué está pasando aquí?

El intérprete de Python convierte el código de código de bytes pyc. La máquina virtual Python procesado el código de bytes, se encontró con una construcción de bucle que dicho iterar sobre una variable que contiene Ninguna. La operación se realizó mediante la invocación del método __iter__ en el Ninguno.

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

Esta es la razón por la ideología pato tipificación de Python es considerado malo. El programador hace algo completamente razonable, con una variable y en tiempo de ejecución que se contamina por Ninguno, las máquinas virtuales pitón intentos al pie del cañón, y vomita hasta un montón de tonterías sin relación por toda la alfombra.

Java o C ++ no tiene estos problemas debido a que un programa de este tipo no se le permitiría a compilar ya que no han definido lo que hay que hacer cuando se produce Ninguno. Python da los lotes programador de cuerda para ahorcarse por que le permite hacer un montón de cosas que se deben no se puede esperar que el trabajo en circunstancias excepcionales. Python es un hombre-sí, decir sí-señor cuando se fuera a ser que le para de hacerse daño, como Java y C ++.

Código: for row in data:
Mensaje de error: TypeError: 'NoneType' object is not iterable

¿Qué objeto se quejaba de que? Elección de dos, row y data. En for row in data, que tiene que ser iterable? Sólo data.

¿Cuál es el problema con data? Su tipo es NoneType. Sólo tiene None tipo NoneType. Así data is None.

Se puede verificar esto en un IDE, o insertando, por ejemplo, print "data is", repr(data) antes de la declaración for, y volver a ejecutar.

Piense en lo que necesita hacer a continuación: ¿Cómo deben "sin datos" pueden representar? Qué escribimos un archivo vacío? Hacemos elevamos una excepción o se identifica una advertencia o callamos?

Otra cosa que puede producir este error es cuando se está configurando algo igual al retorno de una función, pero se olvidó de volver realidad nada.

Ejemplo:

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)

Este es un poco de un error difícil de detectar debido a que el error también se puede producir si la variable de fila pasa a ser Ninguno en una de las iteraciones. La forma de detectar es que la traza produce un error en la última línea y no dentro de la función.

Si su único devolver una variable de una función, no estoy seguro de si se produce el error ... Me error sospechoso "objeto 'NoneType' no es iterable en Python" en este caso es en realidad lo que implica "Hey, 'm tratando de iterar sobre los valores de retorno a asignarlos a estas tres variables en orden, pero yo sólo estoy poniendo Ninguno para repetir "

Esto significa que la variable de datos está pasando Ninguno (que es de tipo NoneType), su equivalente para nada . Por lo que no puede ser iterable como una lista, ya que están tratando de hacer.

Estás llamando write_file con argumentos como este:

write_file(foo, bar)

Pero usted no ha definido 'foo' correctamente, o si tiene un error en su código para que sea creando una nueva variable vacía y pasándolo en.

Para mí fue un caso de tener mi maravilloso sombrero en lugar del 3 Python uno.

Ha olvidado la palabra clave return al final de una función def.

De no haber sido codificación de Python 3 en serio durante un par de meses. Se piensa última declaración evaluado en la rutina estaba siendo devuelta por el camino maravilloso.

Tomó unas pocas iteraciones, mirando el seguimiento de la pila, la inserción de bloque de depuración try: ... except TypeError: ... / paso a paso a través de código de averiguar lo que estaba mal.

La solución para el mensaje ciertamente no hizo saltar el error en mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top