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)

Ответ 1

Это означает, что значение data - None.

Ответ 2

Объяснение ошибки: объект '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 являются Sneaky, и могут проникнуть из лямбд:

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__ метод __iter__, поэтому виртуальная машина Python сообщает вам, что она видит: у NoneType нет метода __iter__.

Вот почему идеология типизации уток в Python считается плохой. Программист делает что-то совершенно разумное с переменной, и во время выполнения она становится зараженной None, виртуальная машина python пытается воевать и набрасывает кучу несвязанной ерунды по всему ковру.

Java или C++ не имеют этих проблем, потому что такая программа не может быть скомпилирована, так как вы не определили, что делать, когда ничего не происходит. Python дает программисту много веревки, чтобы повеситься, позволяя вам делать много вещей, которые не должны работать в исключительных обстоятельствах. Python - "да", он говорит "да-сэр", когда он мешает вам навредить себе, как это делают Java и C++.

Ответ 3

Код: 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 и повторным запуском.

Подумайте, что вам нужно сделать дальше: Как следует представлять "нет данных"? Мы пишем пустой файл? Мы поднимаем исключение или заносим предупреждение или молчали?

Ответ 4

Еще одна вещь, которая может вызвать эту ошибку, заключается в том, что вы устанавливаете что-то равное возврату от функции, но забыли что-либо вернуть.

Пример:

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 для повторения "

Ответ 5

Это означает, что переменная данных передается None (которая является типом NoneType), ее эквивалент ни для чего. Таким образом, он не может быть итерируем как список, как вы пытаетесь сделать.

Ответ 6

Вы вызываете write_file с такими аргументами:

write_file(foo, bar)

Но вы не определили "foo" правильно, или у вас есть опечатка в вашем коде, чтобы он создавал новую пустую переменную и передавал ее.

Ответ 7

Это может произойти, если fieldlist для DictWriter - None!

Ответ 8

Для меня это был случай, когда вместо Python 3 была надета моя шляпа Groovy.

Забыл ключевое слово return в конце функции def.

Я не программировал Python 3 всерьез пару месяцев. Думал, что последнее утверждение, оцененное в рутине, возвращалось по Groovy.

Сделал несколько итераций, просматривая трассировку стека, вставляя try:... except TypeError:... блокировать отладку/пошаговое выполнение кода, чтобы выяснить, в чем дело.

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