Frage

Was bedeutet Fehler TypeError: 'NoneType' object is not iterable bedeuten?

Ich bin es auf diesem Python-Code bekommen:

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)
War es hilfreich?

Lösung

Es bedeutet, dass der Wert von data ist None.

Andere Tipps

Fehlererklärung: 'NoneType' Objekt ist nicht iterable

In python2 ist NoneType die Art der None. In Python3 NoneType ist die Klasse der None, zum Beispiel:

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

Iterieren über eine Variable, die den Wert None hat versagt:

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

Python Methoden geben NoneType, wenn sie nicht einen Wert zurückgeben:

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

Sie benötigen ein Schleifenkonstrukte für NoneType wie folgt zu überprüfen:

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

sagt Guido nur Gebrauch is für None zu überprüfen, weil is robuster ist Identitätsprüfung. Nicht Gleichheit Operationen verwenden, weil diese Blase-up implementationitis ihre eigenen spucken kann. Pythons Coding Stilrichtlinien - PEP-008

NoneTypes sind hinterhältig und kann in von lambdas schleichen:

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

NoneType ist kein gültiges Stichwort:

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

Verkettung von None und einem String:

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

Was ist hier los?

Python-Interpreter Ihren Code pyc Bytecode umgewandelt. Die Python virtuelle Maschine den Bytecode verarbeitet werden, begegnet es ein Schleifenkonstrukt, das die iterieren über eine variable enthält Keine. Der Vorgang wurde durch Aufrufen der __iter__ Methode auf dem None durchgeführt.

Keine hat keine __iter__ Methode definiert, so Python die virtuelle Maschine, die Sie sagt, was er sieht: dass NoneType keine __iter__ Methode hat.

Aus diesem Grund Ideologie Pythons duck-typing ist schlecht betrachtet. Der Programmierer tut etwas völlig in Ordnung mit einem variablen und zur Laufzeit es wird durch Keine kontaminiert, auf dem Python virtuelle Maschine versucht, Soldaten und kotzt ein Bündel von nicht verwandtem Unsinn auf dem Teppich.

Java oder C ++ nicht über diese Probleme, weil ein solches Programm nicht erlaubt sein würde zu kompilieren, da Sie haben nicht definiert, was zu tun ist, wenn keine auftritt. Python gibt die Programmierer viel Seil selbst zu hängen, indem Sie viele Dinge zu tun, die Arbeit unter außergewöhnlichen Umständen kann nicht erwartet werden sollte. Python ist ein Ja-Sager, sagen Ja-Herr, wenn es aus Ihnen zu stoppen, sich zu schaden, wie Java und C ++ der Fall ist.

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

Welche Aufgabe wird es beklagen? Wahl von zwei, row und data. In for row in data, die iterable sein muss? Nur data.

Was ist das Problem mit data? Seine Art ist NoneType. Nur None hat Typ NoneType. So data is None.

Sie können dies in einer IDE überprüfen, oder beispielsweise durch Einfügen print "data is", repr(data) vor der for Anweisung, und wieder ausgeführt wird.

Überlegen Sie, was Sie brauchen, als nächstes zu tun: Wie soll „keine Daten“ dargestellt werden? Haben wir eine leere Datei schreiben? Haben wir eine Ausnahme auslösen oder melden eine Warnung oder schweigen?

Eine andere Sache, die diesen Fehler erzeugen kann, ist, wenn man etwas gleich der Rückkehr von einer Funktion einstellen, aber vergessen, um tatsächlich etwas zurück.

Beispiel:

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)

Dies ist ein wenig von einem harten Fehler zu erkennen, weil der Fehler auch erzeugt werden, wenn die Zeilenvariable None auf einen der Iterationen sein geschieht. Die Art und Weise, es zu erkennen ist, dass die Spur in der letzten Zeile fehlschlägt und nicht innerhalb der Funktion.

Wenn Ihr nur eine Variable aus einer Funktion zurückkehrt, bin ich nicht sicher, ob der Fehler würde erzeugt ... Ich vermute Fehler „‚NoneType‘Objekt ist nicht iterable in Python“ in diesem Fall tatsächlich impliziert, „Hey, ich ‚m iterieren die Rückgabewerte zu versuchen, sie auf diese drei Variablen zuweisen, um aber ich bin nur Keine bekommen iterieren"

Es bedeutet, dass die Datenvariable None ist vorbei (welcher Typ NoneType ist), das äquivalent für nichts . So ist es nicht durchsuchbar als Liste sein kann, wie Sie versuchen zu tun.

Du nennst write_file mit Argumenten wie folgt aus:

write_file(foo, bar)

Aber Sie haben nicht definiert ‚foo‘ richtig, oder Sie haben einen Tippfehler in Ihrem Code so, dass es eine neue leere Variable erstellen und übergeben Sie in.

Für mich war es ein Fall von mit meinem Groovy Hut auf statt der Python 3 ein.

Haben Sie das return Schlüsselwort am Ende einer def Funktion.

Ist für ein paar Python Codierung 3 ernsthaft Monate nicht. Wurde in Routine ausgewertet letzte Aussage denkt pro Groovy Art und Weise zurück wurde.

Nahm ein paar Wiederholungen, an dem Stack-Trace sucht, Einfügen try: ... except TypeError: ... Block Debugging / Schritt durch Code, um herauszufinden, was falsch war.

Die Lösung für die Nachricht sicherlich nicht den Fehler bei mir machen springen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top