web-dev-qa-db-fra.com

TypeError: L'objet 'NoneType' n'est pas itérable dans Python

Que signifie erreur TypeError: 'NoneType' object is not iterable?

Je l'obtiens sur ce code Python:

def write_file(data, filename): # creates file and writes list to it
  with open(filename, 'wb') as outfile:
    writer = csv.writer(outfile)
    for row in data: # ABOVE ERROR IS THROWN HERE
      writer.writerow(row)

Cela signifie que la valeur de data est None.

169
vanza

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.

Itérer sur une variable ayant la valeur Aucune échoue:

for a in None:
    print("k")     #TypeError: 'NoneType' object is not iterable

Les méthodes Python renvoient 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 d'utiliser uniquement is pour rechercher None car is est plus robuste pour la vérification d'identité. N'utilisez pas d'opérations d'égalité, car elles peuvent entraîner leur propre mise en œuvre. Directives de style de codage Python - PEP-008

NoneTypes est Sneaky et peut se glisser dans les 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 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 dit itérer sur une variable contenant None. L'opération a été effectuée en appelant la méthode __iter__ sur la méthode None.

None n'a pas de méthode __iter__ définie, donc la machine virtuelle de Python vous dit ce qu'elle voit: que NoneType n'a pas de méthode __iter__.

C'est pourquoi l'idéologie typographie de Python est considérée comme mauvaise. Le programmeur fait quelque chose de complètement raisonnable avec une variable et au moment de l'exécution, il est contaminé par None, la machine virtuelle python tente de persister et lance un tas de bêtises sans lien sur le tapis.

Java ou C++ ne rencontre pas ces problèmes, car un tel programme ne serait pas autorisé à compiler car vous n'avez pas défini ce qu'il faut faire lorsque aucun ne se produit. Python donne beaucoup de corde au programmeur pour se pendre en vous permettant de faire beaucoup de choses qui ne devraient pas fonctionner dans des circonstances exceptionnelles. Python est un "oui-man", qui dit "oui-monsieur" lorsque cela vous empêche de vous faire du mal, comme Java et le C++.

64
Eric Leschinski

Code: for row in data:
Message d'erreur: TypeError: 'NoneType' object is not iterable

De quel objet se plaint-il? Choix de deux, row et data. Dans for row in data, lequel doit être itérable? Seulement data.

Quel est le problème avec data? Son type est NoneType. Seul None a le type NoneType. Donc, data is None.

Vous pouvez le vérifier dans un IDE ou en insérant, par exemple, print "data is", repr(data) avant l'instruction for, puis à nouveau exécuté.

Pensez à ce que vous devez faire ensuite: Comment "aucune donnée" ne devrait-elle être représentée? Est-ce qu'on écrit un fichier vide? Est-ce que nous levons une exception ou consignons un avertissement ou gardons le silence?

63
John Machin

Une autre chose qui peut produire cette erreur est lorsque vous définissez une valeur égale au retour d'une fonction, mais que vous avez oublié de renvoyer quoi que ce soit.

Exemple:

def foo(dict_of_dicts):
    for key, row in dict_of_dicts.items():
        for key, inner_row in row.items():
            Do SomeThing
    #Whoops, forgot to return all my stuff

return1, return2, return3 = foo(dict_of_dicts)

Il s’agit d’une erreur difficile à détecter, car elle peut également être générée si la variable de ligne est NULL sur l’une des itérations. Pour le repérer, la trace échoue sur la dernière ligne et non à l'intérieur de la fonction.

Si vous ne retournez qu'une seule variable d'une fonction, je ne sais pas si l'erreur sera produite ... J'imagine que l'erreur "L'objet 'NoneType' n'est pas itérable en Python" implique en réalité "Hé, j'essaie itérer sur les valeurs de retour pour les assigner à ces trois variables dans l'ordre mais je ne fais qu'obtenir à l'itération "

17
gunslingor

Cela signifie que la variable de données transmet Aucun (qui est de type NoneType), son équivalent pour rien. Donc, ce ne peut pas être une liste, comme vous essayez de le faire.

8
Rod

Vous appelez write_file avec des arguments tels que:

write_file(foo, bar)

Mais vous n'avez pas défini correctement "foo", ou vous avez une faute de frappe dans votre code qui crée une nouvelle variable vide et la transmet.

7
clee

Pour moi, mon Groovy hat était activé plutôt que le Python 3.

Oublié le mot clé return à la fin d'une fonction def.

N'avait pas codé Python 3 sérieusement depuis deux mois. Pensait-on que la dernière déclaration évaluée de routine était renvoyée selon la méthode Groovy.

A pris quelques itérations, en regardant la trace de la pile, en insérant try: ... except TypeError: ... bloquer le débogage/avancer pas à pas dans le code pour comprendre ce qui n'allait pas.

La solution pour le message n'a certainement pas fait que l'erreur me saute aux yeux.

0
JGFMK