Вопрос

Что делает ошибку 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, чтобы выяснить, что было неверно.

Решение для сообщения, безусловно, не сделало ошибку выскочить у меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top