Que signifie l'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)
None
est contraint en une séquence, il doit produire une séquence vide, totalement inoffensive.None
n'est jamais contraint à quoi que ce soit . Le fait deNone
se comporter en silence comme les autres types cache les erreurs; c'est le contraire de «inoffensif». Si vous avez besoin d'un espace réservé faux pour la séquence vide, vous pouvez utiliser()
ou''
/""
, qui sont tous deux des singletons et peuvent être chargés à un prix aussi avantageux queNone
. Si vous voulez choisir de traiter silencieusement tout ce qui est faux comme une séquence vide, vous pouvez le fairefor row in data or ():
, mais personne ne le fait, car passerNone
à une fonction qui attend une séquence est une erreur qui ne devrait pas passer en silence.Réponses:
Cela signifie que la valeur de
data
estNone
.la source
for
boucle au lieu de lever une exception. La conception de Python est imparfaite ici. QuandNone
est traité comme un itérable, il doit au moins renvoyer une liste vide. Cette exception n'a jamais aidé personne dans la vraie vie à part nous obliger à insérer quelquesif data is not None:
types de manipulation horribles .fieldlist
pour leDictWriter
estNone
!for i in data or []
data
c'est le cas ou nonNone
, mais de laisser l'exception se produire. Vous voulez que les consommateurs de votre API sachent lorsqu'ils ne l'ont pas utilisée correctement. AccepterNone
comme une séquence vide laisserait des erreurs commemylist = mylist.extend(morestuff)
, réussir à se cacher encore plus longtemps; ils pensent qu'ils ontextend
édité unlist
(et ils l'ont fait, mais l'ont immédiatement remplacé parNone
), puis le passent à la fonction de l'OP et se demandent pourquoi le fichier est vide, sans erreur d'aucune sorte.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:
L'itération sur une variable qui a la valeur None échoue:
Les méthodes Python retournent NoneType si elles ne renvoient pas de valeur:
Vous devez vérifier vos constructions en boucle pour NoneType comme ceci:
Guido dit seulement utiliser
is
pour vérifierNone
car ilis
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-008Aucun Les types sont sournois et peuvent se faufiler à partir de lambdas:
NoneType n'est pas un mot clé valide:
Concaténation de
None
et d'une chaîne: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 ++.
la source
NoneType
etNone
(b) pense queNameError: name 'NoneType' is not defined
etTypeError: cannot concatenate 'str' and 'NoneType' objects
sont les mêmes queTypeError: 'NoneType' object is not iterable
(c) la comparaison entre Python et java est "un tas de non-sens sans rapport"null
à une fonction qui attend n'importe quel type de collection. C ++ aurait le même problème (mais généralement mourir dans un segfault sans signaler la cause) pournullptr
(certes, un bon C ++ utilise rarement des pointeurs, mais ce que vous avez démontré est un mauvais Python, et un mauvais C ++ peut aussi mourir à l'exécution à partir de valeurs nulles) . Python fait la bonne chose ici; ce n'est pas "soldat sur", c'est une erreur au moment où vous essayez d'utiliserNone
pour quelque choseNone
ne peut pas faire. Votre problème n'est pas avec Python, c'est avec les langages typés dynamiquement en général.Code:
for row in data:
Message d'erreur:
TypeError: 'NoneType' object is not iterable
De quel objet se plaint-il? Choix de deux,
row
etdata
. Dansfor row in data
, qui doit être itérable? Seulementdata
.Quel est le problème
data
? Son type estNoneType
. A seulement leNone
typeNoneType
. Alorsdata is None
.Vous pouvez le vérifier dans un IDE, ou en insérant par exemple
print "data is", repr(data)
avant l'for
instruction et en le relançant.Réfléchissez à ce que vous devez faire ensuite: comment représenter «aucune donnée»? Écrivons-nous un fichier vide? Levons-nous une exception, enregistrons-nous un avertissement ou gardons-nous le silence?
la source
Une autre chose qui peut produire cette erreur est lorsque vous définissez quelque chose égal au retour d'une fonction, mais que vous avez oublié de retourner quoi que ce soit.
Exemple:
C'est un peu une erreur difficile à repérer car l'erreur peut également être produite si la variable de ligne se trouve être None sur l'une des itérations. Le moyen de le repérer est que la trace échoue sur la dernière ligne et non à l'intérieur de la fonction.
Si vous ne renvoyez qu'une seule variable d'une fonction, je ne suis pas sûr si l'erreur serait produite ... Je soupçonne que l'erreur "L'objet 'NoneType' n'est pas itérable en Python" dans ce cas implique en fait "Hey, j'essaye pour itérer sur les valeurs de retour pour les affecter à ces trois variables dans l'ordre, mais je n'obtiens aucun pour itérer "
la source
Cela signifie que la variable de données passe None (qui est de type NoneType), son équivalent pour rien . Il ne peut donc pas être itérable sous forme de liste, comme vous essayez de le faire.
la source
for row in data or []:
Vous appelez write_file avec des arguments comme celui-ci:
Mais vous n'avez pas défini correctement 'foo', ou vous avez une faute de frappe dans votre code afin qu'il crée une nouvelle variable vide et la passe.
la source
Pour moi, il s'agissait d'avoir mon chapeau Groovy au lieu de celui de Python 3.
J'ai oublié le
return
mot - clé à la fin d'unedef
fonction.Je n'avais pas vraiment codé Python 3 depuis quelques mois. Je pensais que la dernière déclaration évaluée dans la routine était renvoyée selon la méthode Groovy.
J'ai pris quelques itérations, en regardant la trace de la pile, en insérant
try: ... except TypeError: ...
le débogage de bloc / en parcourant le code pour comprendre ce qui n'allait pas.La solution du message ne m'a certainement pas fait sauter l'erreur.
la source