TypeError: «NoneType» объект не указан в Python
Вопрос
Что делает ошибку 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
.
Другие советы
Объяснение ошибки: объект «NONETYPE» не является ими
В Python2 Nonetype - это тип ничего. В Python3 Nonetype является класс никого, например:
>>> 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
Вам нужно проверить свои петлиные конструкции для нетопы, как это:
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
более устойчив к проверке личности. Не используйте операции по равенству, потому что те могут плавать в Bubble-Up Replistitis их собственного. Руководство по кодированию 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 Bytecode. Виртуальная машина Python обрабатывает BYTECODE, он столкнулся с петлиной конструкцией, которая упоминала итерацию по поводу переменной, содержащей ничего. Операция была выполнена путем вызова __iter__
Метод на нет.
Ни у кого нет __iter__
Метод определен, поэтому виртуальная машина Python говорит вам, что он видит: не имеет __iter__
метод.
Вот почему Утка Python Идеология считается плохо. Программист делает что-то совершенно разумное с переменной и во время выполнения, она не загрязнена тем, что они не загрязнены, виртуальная машина Python пытается солдату, и Pukes поднимает кучу несвязанной ерунды по всему ковре.
У 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)
Это немного жесткой ошибки для обнаружения, потому что ошибка также может быть изготовлена, если переменная строки случается не в одной из итераций. Способ обнаружить то, что след не удается на последней строке, а не внутри функции.
Если вы возвращаете одну переменную из функции, я не уверен, что ошибка будет произведена ... я подозреваю, что ошибка «Нетоновый» объект не указан в Python »в этом случае на самом деле подразумевает« Эй, я пытаюсь переносить значения возврата, чтобы назначить их эти три переменных в порядке, но я не получаю только не повторять
Это означает, что переменная данных пропускает None (которая является типом NONETYPE), его эквивалент ничего. Отказ Так что это не может быть истеренным в виде списка, как вы пытаетесь сделать.
Вы звоните write_file с аргументами, как это:
write_file(foo, bar)
Но вы не определили «Foo» правильно, или у вас есть опечатка в вашем коде, чтобы он создавал новую пустую переменную и передаю ее.
Для меня это было случай Groovy Hat вместо Python 3 один.
Забыл return
ключевое слово в конце def
функция.
Не был кодирован Python 3 из-за серьезных на пару месяцев. Думал, задумавшее последнее утверждение, оцененное в рутине, возвращается на канальный путь.
Взял несколько итераций, глядя на трассировку стека, вставляя try: ... except TypeError: ...
Блокируйте отладку / STOWPING THRE CODE, чтобы выяснить, что было неверно.
Решение для сообщения, безусловно, не сделало ошибку выскочить у меня.