Explication de l'erreur: l'objet 'NoneType' n'est pas itérable
En python2, NoneType est le type de None. En Python3, NoneType est la classe de None, par exemple:
>>> 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'itération sur une variable qui a la valeur None échoue:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Les méthodes Python retournent NoneType si elles ne renvoient pas de valeur:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Vous devez vérifier vos constructions en boucle pour NoneType comme ceci:
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 dit seulement utiliser is
pour vérifier None
car il is
est plus robuste à la vérification d'identité. N'utilisez pas les opérations d'égalité, car elles peuvent cracher leur propre implémentation. Directives de style de codage de Python - PEP-008
Aucun Les types sont sournois et peuvent se faufiler à 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'est pas un mot clé valide:
a = NoneType #NameError: name 'NoneType' is not defined
Concaténation de None
et d'une chaîne:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Que se passe t-il ici?
L'interpréteur de Python a converti votre code en bytecode pyc. La machine virtuelle Python a traité le bytecode, elle a rencontré une construction en boucle qui disait itérer sur une variable contenant None. L'opération a été effectuée en invoquant la __iter__
méthode sur None.
Aucun n'a aucune __iter__
méthode définie, donc la machine virtuelle de Python vous dit ce qu'elle voit: que NoneType n'a pas de __iter__
méthode.
C'est pourquoi l' idéologie de type canard de Python est considérée comme mauvaise. Le programmeur fait quelque chose de tout à fait raisonnable avec une variable et au moment de l'exécution, il est contaminé par None, la machine virtuelle python tente de persévérer et vomit un tas de bêtises sans rapport sur le tapis.
Java ou C ++ n'ont pas ces problèmes car un tel programme ne serait pas autorisé à se compiler puisque vous n'avez pas défini quoi faire lorsque None se produit. Python donne au programmeur beaucoup de cordes pour se pendre en vous permettant de faire beaucoup de choses qui ne devraient pas fonctionner dans des circonstances exceptionnelles. Python est un oui-homme, disant oui-monsieur quand il veut vous empêcher de vous faire du mal, comme le font Java et C ++.
None
est contraint en une séquence, il doit produire une séquence vide, totalement inoffensive.