Wyjaśnienie błędu: Obiekt „NoneType” nie jest iterowalny
W python2 NoneType jest typem None. W Python3 NoneType jest klasą None, na przykład:
>>> 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.
Iteracja po zmiennej, która ma wartość None kończy się niepowodzeniem:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Metody Pythona zwracają NoneType, jeśli nie zwracają wartości:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Musisz sprawdzić konstrukcje zapętlające dla NoneType w następujący sposób:
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 mówi, że używaj tylko is
do sprawdzania, None
ponieważ is
jest bardziej odporny na sprawdzanie tożsamości. Nie używaj operacji równościowych, ponieważ mogą one same wypluć wybuchowe zapalenie. Wytyczne dotyczące stylu kodowania w Pythonie - PEP-008
NoneTypes są Sneaky i mogą wkraść się z lambd:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType nie jest prawidłowym słowem kluczowym:
a = NoneType #NameError: name 'NoneType' is not defined
Łączenie None
i ciąg znaków:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Co tu się dzieje?
Interpreter Pythona przekonwertował twój kod na kod bajtowy pyc. Maszyna wirtualna Pythona przetworzyła kod bajtowy, napotkała konstrukcję zapętloną, która mówi, że wykonuje iterację po zmiennej zawierającej None. Operacja została wykonana przez wywołanie __iter__
metody na None.
Żadna nie ma __iter__
zdefiniowanej metody, więc maszyna wirtualna Pythona mówi ci, co widzi: że NoneType nie ma __iter__
metody.
Właśnie dlatego ideologia pisania na klawiaturze w Pythonie jest uważana za złą. Programista robi coś całkiem rozsądnego ze zmienną i w czasie wykonywania zostaje ona skażona przez Brak, maszyna wirtualna Pythona próbuje się do niej przyłączyć i wymiotuje po całym dywanie garść niepowiązanych bzdur.
Java lub C ++ nie ma tych problemów, ponieważ taki program nie mógłby się kompilować, ponieważ nie zdefiniowano, co zrobić, gdy wystąpi Brak. Python daje programiście mnóstwo liny do powieszenia, pozwalając ci robić wiele rzeczy, od których nie można oczekiwać, że zadziałają w wyjątkowych okolicznościach. Python jest człowiekiem na tak, mówiąc tak, proszę pana, gdy ma to na celu powstrzymanie cię przed wyrządzeniem sobie krzywdy, tak jak robią to Java i C ++.
None
jest wymuszony jako sekwencja, musi wytworzyć pustą sekwencję, całkowicie nieszkodliwą.