Erläuterung des Fehlers: Das Objekt 'NoneType' kann nicht iteriert werden
In Python2 ist NoneType der Typ None. In Python3 ist NoneType die Klasse 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.
Das Iterieren über eine Variable mit dem Wert None schlägt fehl:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Python-Methoden geben NoneType zurück, wenn sie keinen Wert zurückgeben:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Sie müssen Ihre Schleifenkonstrukte wie folgt auf NoneType ü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
Guido sagt, nur verwenden is
, um zu prüfen, None
weil is
ist robuster für die Identitätsprüfung. Verwenden Sie keine Gleichstellungsoperationen, da diese selbst eine Bubble-up-Implementierungsentzündung auslösen können. Pythons Richtlinien für den Codierungsstil - PEP-008
NoneTypes sind hinterhältig und können sich von Lambdas einschleichen:
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 Schlüsselwort:
a = NoneType #NameError: name 'NoneType' is not defined
Verkettung von None
und eine Zeichenfolge:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Was ist denn hier los?
Der Python-Interpreter hat Ihren Code in Pyc-Bytecode konvertiert. Die virtuelle Python-Maschine verarbeitete den Bytecode und stieß auf ein Schleifenkonstrukt, das über eine Variable iterierte, die None enthielt. Die Operation wurde ausgeführt, indem die __iter__
Methode für None aufgerufen wurde.
Für None ist keine __iter__
Methode definiert, daher sagt Ihnen die virtuelle Maschine von Python, was sie sieht: NoneType hat keine __iter__
Methode.
Aus diesem Grund wird Pythons Ideologie der Ententypisierung als schlecht angesehen. Der Programmierer macht mit einer Variablen etwas völlig Vernünftiges und zur Laufzeit wird sie durch None kontaminiert. Die virtuelle Python-Maschine versucht, Soldaten zu werden, und kotzt eine Menge Unsinn auf dem ganzen Teppich.
Java oder C ++ haben diese Probleme nicht, da ein solches Programm nicht kompiliert werden darf, da Sie nicht definiert haben, was zu tun ist, wenn None auftritt. Python gibt dem Programmierer viel Seil, um sich aufzuhängen, indem es Ihnen ermöglicht, viele Dinge zu tun, von denen nicht erwartet werden kann, dass sie unter außergewöhnlichen Umständen funktionieren. Python ist ein Ja-Mann, der Ja-Sir sagt, wenn es darum geht, Sie davon abzuhalten, sich selbst Schaden zuzufügen, wie es Java und C ++ tun.
None
es als Sequenz erzwungen wird, muss es eine leere Sequenz erzeugen, die völlig harmlos ist.