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:
>>> 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.
Iterar 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 como este:
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 se usa is
para verificar None
porque is
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-008
NoneTypes son furtivos y pueden colarse de 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 cadena:
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 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 ++.
None
se coacciona como secuencia, debe producir una secuencia vacía, totalmente inofensiva.