Объяснение ошибки: объект '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 ++ не имеют этих проблем, потому что такой программе нельзя будет компилировать, поскольку вы не определили, что делать, когда возникает None. Python дает программисту массу возможностей повеситься, позволяя делать множество вещей, от которых нельзя ожидать, что они сработают в исключительных обстоятельствах. Python - согласный человек, говоря «да-сэр», когда он пытается помешать вам навредить себе, как это делают Java и C ++.
person
Eric Leschinski
schedule
07.07.2015
None
вводится как последовательность, он должен производить пустую последовательность, совершенно безвредную. - person nehem   schedule 01.09.2017None
никогда не принуждают к чему-либо. ЕслиNone
молча ведет себя как другие типы, скрываются ошибки; это противоположность безобидному. Если вам нужен ложный заполнитель для пустой последовательности, вы можете использовать()
или _4 _ / _ 5_, оба из которых являются одиночными и могут быть загружены так же дешево, какNone
. Если вы хотите разрешить молча обрабатывать любую ложную информацию как пустую последовательность, вы можете сделатьfor row in data or ():
, но никто этого не сделает, потому что передачаNone
функции, ожидающей последовательность, является ошибкой, которая не должна проходить молча. - person ShadowRanger   schedule 05.10.2018str
можно с радостью рассматривать как итерацию, что не так в принуждении None быть пустым итерабельным, особенно там, где намерение ясно. Что еще хуже, списки и dict могут быть преобразованы в логические значения, даже строки тоже. Где здесь держится строго типизированный аргумент? - person nehem   schedule 20.07.2021