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 is
para verificar None
porque 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 None
e 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.