TypeError: объект 'NoneType' не повторяется в Python - PullRequest
114 голосов
/ 08 октября 2010

Что означает ошибка 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)

Ответы [ 7 ]

165 голосов
/ 08 октября 2010

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

63 голосов
/ 08 октября 2010

Код: for row in data:
Сообщение об ошибке: TypeError: 'NoneType' object is not iterable

На какой объект он жалуется?Выбор из двух, row и datafor row in data, что должно быть повторяемым?Только data.

В чем проблема с data?Его тип NoneType.Только None имеет тип NoneType.Так что data is None.

Вы можете убедиться в этом в IDE или, вставив, например, print "data is", repr(data) перед оператором for, и запустить заново.

Подумайте, чтовам нужно сделать следующее: Как должно быть представлено «нет данных»?Мы пишем пустой файл?Вызываем ли мы исключение или регистрируем предупреждение или молчим?

62 голосов
/ 07 июля 2015

Объяснение ошибки: объект '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

НетТипы подлые и могут проникать из лямбд:

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 ++ не имеют этих проблем, потому что такая программа не может быть скомпилирована, поскольку вы не определили, что делать, когда ничего не происходит. Python дает программисту много веревки, чтобы повеситься, позволяя вам делать много вещей, которые не должны работать в исключительных обстоятельствах. Python - «да», он говорит «да-сэр», когда он мешает вам навредить себе, как это делают Java и C ++.

17 голосов
/ 25 января 2017

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

Пример:

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 на одной из итераций.Можно определить, что трассировка завершается с ошибкой в ​​последней строке, а не внутри функции.

Если вы возвращаете только одну переменную из функции, я не уверен, что произойдет ошибка ... IПодозреваемая ошибка «Объект NoneType не является итеративным в Python», в данном случае фактически подразумевается «Эй, я пытаюсь перебрать возвращаемые значения, чтобы назначить их этим трем переменным по порядку, но я получаю только None для итерациинад "

8 голосов
/ 08 октября 2010

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

7 голосов
/ 08 октября 2010

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

write_file(foo, bar)

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

0 голосов
/ 27 ноября 2018

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

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

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

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

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

...