Объяснение ошибки: объект 'NoneType' не повторяется
В python2 NoneType - это тип None. В Python3 NoneType является классом None, например:
>>> 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.
Перебор переменной со значением None завершается ошибкой:
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
Методы Python возвращают NoneType, если они не возвращают значение:
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
Вам необходимо проверить свои циклические конструкции для NoneType, например:
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
Гвидо говорит, что используйте is
только для проверки на None
, потому что is
более устойчив к проверке личности. Не используйте операции по равенству, потому что они могут выплевывать собственные реализации. Руководство по стилю кодирования Python - PEP-008
НетТипы подлые и могут проникать из лямбд:
import sys
b = lambda x : sys.stdout.write("k")
for a in b(10):
pass #TypeError: 'NoneType' object is not iterable
NoneType не является допустимым ключевым словом:
a = NoneType #NameError: name 'NoneType' is not defined
Конкатенация None
и строка:
bar = "something"
foo = None
print foo + bar #TypeError: cannot concatenate 'str' and 'NoneType' objects
Что здесь происходит?
Интерпретатор Python преобразовал ваш код в байт-код pyc. Виртуальная машина Python обработала байт-код, она столкнулась с циклической конструкцией, в которой было указано итерация по переменной, содержащей None. Операция была выполнена путем вызова метода __iter__
для None.
Ни у одного не определен метод __iter__
, поэтому виртуальная машина Python сообщает вам, что видит: у NoneType нет метода __iter__
.
Вот почему идеология Python для ввода утки считается плохой. Программист делает что-то совершенно разумное с переменной, и во время выполнения она становится зараженной None, виртуальная машина python пытается воевать и набрасывает кучу несвязанной ерунды по всему ковру.
Java или C ++ не имеют этих проблем, потому что такая программа не может быть скомпилирована, поскольку вы не определили, что делать, когда ничего не происходит. Python дает программисту много веревки, чтобы повеситься, позволяя вам делать много вещей, которые не должны работать в исключительных обстоятельствах. Python - «да», он говорит «да-сэр», когда он мешает вам навредить себе, как это делают Java и C ++.