Explicação do erro: O objeto 'NoneType' não é iterável
Em python2, NoneType é o tipo de None. No Python3, NoneType é a classe None, por exemplo:
>>> 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.
A iteração sobre uma variável com valor Nenhum falha:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Os métodos Python retornam NoneType se eles não retornam um valor:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Você precisa verificar suas construções de loop para NoneType assim:
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 diz que apenas use ispara verificar Noneporque isé mais robusto para verificação de identidade. Não use operações de igualdade porque elas podem cuspir implementações próprias. Diretrizes de estilo de codificação do Python - PEP-008
Os tipos são furtivos e podem se infiltrar a partir de lambdas:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType não é uma palavra-chave válida:
a = NoneType #NameError: name 'NoneType' is not defined
Concatenação de Nonee uma string:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
O que está acontecendo aqui?
O intérprete do Python converteu seu código em bycode pyc. A máquina virtual Python processou o bytecode, encontrou uma construção em loop que dizia iterar sobre uma variável que continha None. A operação foi realizada invocando o __iter__método no None.
Nenhum possui um __iter__método definido, portanto, a máquina virtual do Python diz o que vê: que o NoneType não tem __iter__método.
É por isso que a ideologia de digitação de pato do Python é considerada ruim. O programador faz algo completamente razoável com uma variável e, em tempo de execução, é contaminado por None, a máquina virtual python tenta resistir e solta um monte de besteiras não relacionadas por todo o tapete.
Java ou C ++ não tem esses problemas porque esse programa não poderia ser compilado, pois você não definiu o que fazer quando nenhum ocorrer. O Python dá ao programador muita corda para se enforcar, permitindo que você faça muitas coisas que não se espera que funcionem em circunstâncias excepcionais. O Python é um sim-homem, dizendo sim-senhor quando o impede de se prejudicar, como Java e C ++ fazem.
Noneé coagido como uma sequência, deve produzir uma sequência vazia, totalmente inofensiva.