Объяснение ошибки: объект 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
NoneTypes являются подлыми, и могут проникать из лямбд:
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 ++.
None
приводится в последовательность, оно должно создавать пустую последовательность, абсолютно безвредную.