Spiegazione dell'errore: l'oggetto 'NoneType' non è iterabile
In python2, NoneType è il tipo di None. In Python3 NoneType è la classe di None, ad esempio:
>>> 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.
L'iterazione su una variabile che ha valore None non riesce:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
I metodi Python restituiscono NoneType se non restituiscono un valore:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Devi controllare i tuoi costrutti in loop per NoneType in questo modo:
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 che usare solo isper verificare Noneperché isè più robusto per il controllo dell'identità. Non usare le operazioni di uguaglianza perché quelle possono sputare l'implementazione del bubble-up. Linee guida sullo stile di codifica di Python - PEP-008
Nessuno I tipi sono subdoli e possono entrare di soppiatto da lambda:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType non è una parola chiave valida:
a = NoneType #NameError: name 'NoneType' is not defined
Concatenazione di Nonee una stringa:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Cosa sta succedendo qui?
L'interprete di Python ha convertito il tuo codice in bytecode pyc. La macchina virtuale Python ha elaborato il bytecode, ha riscontrato un costrutto in loop che ha detto iterare su una variabile contenente None. L'operazione è stata eseguita invocando il__iter__ metodo su Nessuno.
Nessuno ha no __iter__ metodo definito, quindi la macchina virtuale di Python ti dice cosa vede: quel NoneType non ha alcun __iter__metodo.
Ecco perché l' ideologia della battuta d'anatra di Python è considerata negativa. Il programmatore fa qualcosa di completamente ragionevole con una variabile e in fase di esecuzione viene contaminato da None, la macchina virtuale Python tenta di fare il soldato e genera un mucchio di sciocchezze non correlate su tutto il tappeto.
Java o C ++ non hanno questi problemi perché non è possibile compilare un programma del genere poiché non è stato definito cosa fare quando si verifica Nessuno. Python dà al programmatore molta corda per impiccarsi permettendoti di fare molte cose che non ci si può aspettare che funzionino in circostanze eccezionali. Python è un sì-uomo, dice sì-signore quando ti impedisce di farti del male, come fa Java e C ++.
Noneviene forzato in sequenza, deve produrre una sequenza vuota, totalmente innocua.