TypeError: ‘NoneType’-object kan niet worden herhaald in Python

Wat betekent fout TypeError: 'NoneType' object is not iterable?

Ik krijg het op deze Python-code:

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)

Antwoord 1, autoriteit 100%

Dit betekent dat de waarde van dataNoneis.


Antwoord 2, autoriteit 42%

Uitleg van fout: ‘NoneType’-object is niet itereerbaar

In python2 is NoneType het type None. In Python3 is NoneType de klasse van None, bijvoorbeeld:

>>> 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.

Itereren over een variabele met de waarde Geen mislukt:

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

Python-methoden retourneren NoneType als ze geen waarde retourneren:

def foo():
    print("k")
a, b = foo()      #TypeError: 'NoneType' object is not iterable

U moet uw looping-constructies voor NoneType als volgt controleren:

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 zegt alleen iste gebruiken om te controleren op Noneomdat isrobuuster is voor identiteitscontrole. Gebruik geen gelijkheidsoperaties, want die kunnen hun eigen bubble-up-implementatie veroorzaken. Richtlijnen voor coderingsstijlen van Python – PEP-008

NoneTypes zijn stiekem en kunnen binnensluipen van lambda’s:

import sys
b = lambda x : sys.stdout.write("k") 
for a in b(10): 
    pass            #TypeError: 'NoneType' object is not iterable 

NoneType is geen geldig zoekwoord:

a = NoneType     #NameError: name 'NoneType' is not defined

Aaneenschakeling van Noneen een tekenreeks:

bar = "something"
foo = None
print foo + bar    #TypeError: cannot concatenate 'str' and 'NoneType' objects

Wat is hier aan de hand?

Python’s tolk heeft uw code omgezet naar pyc-bytecode. De virtuele machine van Python verwerkte de bytecode, hij kwam een lusconstructie tegen die zei dat hij een variabele met Geen herhaalde. De bewerking werd uitgevoerd door de methode __iter__op de None aan te roepen.

None heeft geen __iter__methode gedefinieerd, dus Python’s virtuele machine vertelt je wat het ziet: dat NoneType geen __iter__methode heeft.

Dit is de reden waarom Python’s duck-typing-ideologie als slecht wordt beschouwd. De programmeur doet iets heel redelijks met een variabele en tijdens runtime wordt deze besmet door Geen, de virtuele python-machine probeert door te vechten en braakt een hoop niet-gerelateerde onzin over het tapijt uit.

Java of C++ heeft deze problemen niet omdat een dergelijk programma niet zou mogen compileren, omdat je niet hebt gedefinieerd wat je moet doen als Geen optreedt. Python geeft de programmeur veel touw om zichzelf op te hangen door je veel dingen te laten doen die onder uitzonderlijke omstandigheden niet zouden moeten werken. Python is een ja-man, die ja-meneer zegt als het je ervan weerhoudt jezelf schade toe te brengen, zoals Java en C++ dat doen.


Antwoord 3, autoriteit 27%

Code: for row in data:
Foutmelding: TypeError: 'NoneType' object is not iterable

Over welk object wordt geklaagd? Keuze uit twee, rowen data.
Wat moet in for row in dataitereerbaar zijn? Alleen data.

Wat is het probleem met data? Het type is NoneType. Alleen Noneheeft het type NoneType. Dus data is None.

Je kunt dit verifiëren in een IDE, of door b.v. print "data is", repr(data)voor de for-instructie en start opnieuw.

Denk na over wat u nu moet doen:
Hoe moet “geen gegevens” worden weergegeven? Schrijven we een leeg bestand? Maken we een uitzondering, loggen we een waarschuwing of zwijgen we?


Antwoord 4, autoriteit 8%

Een ander ding dat deze fout kan veroorzaken, is wanneer u iets instelt dat gelijk is aan de terugkeer van een functie, maar vergeet om daadwerkelijk iets terug te geven.

Voorbeeld:

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)

Dit is een klein beetje van een moeilijke fout om te zien omdat de fout ook kan worden geproduceerd als de rij variabele toevallig geen op een van de iteraties is. De manier om te zien, is dat het trace niet op de laatste regel is en niet in de functie.

Als u alleen één variabele van een functie retourneert, ben ik niet zeker of de fout zou worden geproduceerd … I-verdachte fout “” ” ” ‘nonetype’ object is niet actief in Python” In dit geval is het eigenlijk impliceren “Hey, I Ik probeer te herhalen over de retourwaarden om ze aan deze drie variabelen toe te wijzen op volgorde, maar ik krijg er alleen geen over “


Antwoord 5, Autoriteit 3%

Dit betekent dat de gegevensvariabele passeren (dat geen nonetype is), het equivalent van niets . Dus het kan niet optimaal zijn als een lijst, terwijl je probeert te doen.


Antwoord 6, Autoriteit 3%

U belt write_file met argumenten zoals deze:

write_file(foo, bar)

Maar u hebt ‘FOO’ niet correct gedefinieerd, of u hebt een typfout in uw code, zodat deze een nieuwe lege variabele maakt en het inhoudt.


Antwoord 7

Voor mij was het een geval van het hebben van mijn Groovy hoed in plaats van de python 3 één.

Gebruik de returnsleutelwoord aan het einde van een defFUNCTION.

had al een paar maanden lang codering van Python 3 in serughest. Was het denken dat de laatste verklaring werd geëvalueerd in routine werd geretourneerd per de Groovy (of Rust) Way.

Nam een paar iteraties, kijkend naar het stapelspoor, het invoegen van try: ... except TypeError: ...blokkeren debuggen / stappend door code om uit te zoeken wat er mis was.

De oplossing voor het bericht heeft zeker niet de fout gemaakt om naar mij te springen.


Antwoord 8

Ga gewoon door wanneer u geen uitzondering krijgt,

Voorbeeld:

  a = None
   if a is None:
       continue
   else:
       print("do something")

Dit kan ultimes zijn die uit DB of een Excel-bestand komt.

Other episodes