Ответ 1
Это означает, что значение data
- None
.
Что означает ошибка TypeError: 'NoneType' object is not iterable
?
Я получаю это на этот код Python:
def write_file(data, filename): # creates file and writes list to it
with open(filename, 'wb') as outfile:
writer = csv.writer(outfile)
for row in data: # ABOVE ERROR IS THROWN HERE
writer.writerow(row)
Это означает, что значение data
- None
.
В 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.
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
def foo():
print("k")
a, b = foo() #TypeError: 'NoneType' object is not iterable
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
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__
метод __iter__
, поэтому виртуальная машина Python сообщает вам, что она видит: у NoneType нет метода __iter__
.
Вот почему идеология типизации уток в Python считается плохой. Программист делает что-то совершенно разумное с переменной, и во время выполнения она становится зараженной None, виртуальная машина python пытается воевать и набрасывает кучу несвязанной ерунды по всему ковру.
Java или C++ не имеют этих проблем, потому что такая программа не может быть скомпилирована, так как вы не определили, что делать, когда ничего не происходит. Python дает программисту много веревки, чтобы повеситься, позволяя вам делать много вещей, которые не должны работать в исключительных обстоятельствах. Python - "да", он говорит "да-сэр", когда он мешает вам навредить себе, как это делают Java и C++.
Код: for row in data:
Сообщение об ошибке: TypeError: 'NoneType' object is not iterable
На каком объекте он жалуется? Выбор из двух, row
и data
.
В for row in data
, который должен быть итерируемым? Только data
.
В чем проблема с data
? Его тип NoneType
. Только None
имеет тип NoneType
. Итак data is None
.
Вы можете проверить это в среде IDE или вставить, например, print "data is", repr(data)
перед оператором for
и повторным запуском.
Подумайте, что вам нужно сделать дальше: Как следует представлять "нет данных"? Мы пишем пустой файл? Мы поднимаем исключение или заносим предупреждение или молчали?
Еще одна вещь, которая может вызвать эту ошибку, заключается в том, что вы устанавливаете что-то равное возврату от функции, но забыли что-либо вернуть.
Пример:
def foo(dict_of_dicts):
for key, row in dict_of_dicts.items():
for key, inner_row in row.items():
Do SomeThing
#Whoops, forgot to return all my stuff
return1, return2, return3 = foo(dict_of_dicts)
Это немного сложная ошибка, чтобы обнаружить, потому что ошибка также может быть произведена, если переменная строки имеет значение None на одной из итераций. Способ обнаружить это - это то, что трассировка выходит из строя на последней строке, а не внутри функции.
Если ваша единственная возвращающая одна переменная из функции, я не уверен, будет ли возникать ошибка... Я подозреваю, что ошибка "Объект NoneType" не является итерируемым в Python ", в данном случае на самом деле подразумевает" Эй, я Я пытаюсь выполнить итерацию над возвращаемыми значениями, чтобы назначить их этим трем переменным в порядке, но я получаю None для повторения "
Это означает, что переменная данных передается None (которая является типом NoneType), ее эквивалент ни для чего. Таким образом, он не может быть итерируем как список, как вы пытаетесь сделать.
Вы вызываете write_file с такими аргументами:
write_file(foo, bar)
Но вы не определили "foo" правильно, или у вас есть опечатка в вашем коде, чтобы он создавал новую пустую переменную и передавал ее.
Это может произойти, если fieldlist
для DictWriter
- None
!
Для меня это был случай, когда вместо Python 3 была надета моя шляпа Groovy.
Забыл ключевое слово return
в конце функции def
.
Я не программировал Python 3 всерьез пару месяцев. Думал, что последнее утверждение, оцененное в рутине, возвращалось по Groovy.
Сделал несколько итераций, просматривая трассировку стека, вставляя try:... except TypeError:...
блокировать отладку/пошаговое выполнение кода, чтобы выяснить, в чем дело.
Решение для сообщения конечно не заставило ошибку выскакивать у меня.