Что означает ошибка 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)
None
приводится в последовательность, оно должно создавать пустую последовательность, абсолютно безвредную.None
никогда ни к чему не принуждают . ИмеяNone
тихо ведут себя как и другие типы скрывает ошибки; это противоположность "безвредного". Если вам нужен ложный заполнитель для пустой последовательности, вы можете использовать()
или''
/""
, оба из которых являются синглетонами и могут быть загружены так же дешево, как иNone
. Если вы хотите подписаться на молчаливую обработку чего-либо ложного как пустой последовательности, вы можете это сделатьfor row in data or ():
, но никто этого не делает, поскольку передачаNone
функции, ожидающей последовательность, является ошибкой, которая не должна проходить молча.Ответы:
Это означает , что значение
data
ISNone
.источник
for
цикл, а не вызывать исключение. Дизайн Python здесь несовершенен. КогдаNone
обрабатывается как итеративный, он должен возвращать как минимум пустой список. Это исключение никогда не помогало никому в реальной жизни, кроме того, что заставляло нас вставлять несколько уродливыхif data is not None:
видов обработки.fieldlist
дляDictWriter
этоNone
!for i in data or []
data
есть или нетNone
, а в том, чтобы исключение произошло. Вы хотите, чтобы потребители вашего API знали, когда они использовали его неправильно. ПринятиеNone
в качестве пустой последовательности позволило бы ошибкам, подобнымmylist = mylist.extend(morestuff)
, спрятаться еще дольше; они думают, чтоextend
редактировалиlist
(и сделали, но затем сразу же заменили егоNone
), затем передают его в функцию OP и задаются вопросом, почему файл пуст, без каких-либо ошибок.Объяснение ошибки: объект NoneType не повторяется
В python2 NoneType является типом None. В Python3 NoneType является классом None, например:
Перебор переменной со значением None завершается неудачно:
Методы Python возвращают NoneType, если они не возвращают значение:
Вам нужно проверить свои циклические конструкции для NoneType следующим образом:
Гвидо говорит, что использовать только
is
для проверки,None
потому чтоis
это более надежно для проверки личности. Не используйте операции по равенству, потому что они могут выплевывать собственные реализации. Руководство по стилю кодирования Python - PEP-008NoneTypes являются подлыми, и могут проникать из лямбд:
NoneType не является допустимым ключевым словом:
Конкатенация
None
и строка:Что тут происходит?
Интерпретатор Python преобразовал ваш код в байт-код pyc. Виртуальная машина Python обработала байт-код, она столкнулась с циклической конструкцией, в которой было указано итерация по переменной, содержащей None. Операция была выполнена путем вызова
__iter__
метода None.Ни у одного
__iter__
метода не определено, поэтому виртуальная машина Python сообщает вам, что она видит: у NoneType нет__iter__
метода.Вот почему идеология типизации Python считается плохой. Программист делает что-то совершенно разумное с переменной, и во время выполнения она становится зараженной None, виртуальная машина python пытается воевать и набирает кучу несвязанной ерунды по всему ковру.
Java или C ++ не имеют этих проблем, потому что такая программа не может быть скомпилирована, так как вы не определили, что делать, когда ничего не происходит. Python дает программисту много веревки, чтобы повеситься, позволяя вам делать много вещей, которые не должны работать в исключительных обстоятельствах. Python - «да», он говорит «да-сэр», когда он мешает вам навредить себе, как это делают Java и C ++.
источник
NoneType
иNone
(б) считает , чтоNameError: name 'NoneType' is not defined
иTypeError: cannot concatenate 'str' and 'NoneType' objects
такие же , какTypeError: 'NoneType' object is not iterable
(в) сравнение между Python и Java является «кучу несвязанных нонсенс»null
к функции, ожидающей любого типа коллекции. C ++ будет иметь ту же проблему (но обычно просто умрет в segfault, не сообщая о причине) дляnullptr
(по общему признанию, хороший C ++ редко использует указатели, но то, что вы продемонстрировали, является плохим Python, и плохой C ++ может умереть во время выполнения от нуля тоже) , Python делает правильные вещи здесь; это не «охота за солдатами», это ошибка в тот момент, когда вы пытаетесь использоватьNone
что-то, чтоNone
не может сделать. Ваша проблема не с Python, а с динамически типизированными языками в целом.Код:
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
оператором, и снова запустив.Подумайте, что вам нужно делать дальше: как должно быть представлено «нет данных»? Мы пишем пустой файл? Вызываем ли мы исключение или регистрируем предупреждение или молчим?
источник
Другая вещь, которая может вызвать эту ошибку, - это когда вы устанавливаете что-то, равное возвращению из функции, но забываете что-либо фактически вернуть.
Пример:
Это небольшая трудная ошибка, которую можно обнаружить, потому что ошибка также может возникнуть, если переменная строки окажется равной None на одной из итераций. Чтобы определить это, трассировка завершается неудачно в последней строке, а не внутри функции.
Если вы возвращаете только одну переменную из функции, я не уверен, что будет получена ошибка ... Я подозреваю, что ошибка "объект NoneType не повторяется в Python" в этом случае фактически подразумевает "Эй, я пытаюсь перебрать возвращаемые значения, чтобы назначить их этим трем переменным по порядку, но я получаю только None для перебора "
источник
Это означает, что переменная данных передает None (тип NoneType), что эквивалентно ни за что . Так что он не может быть повторяем как список, как вы пытаетесь это сделать.
источник
for row in data or []:
Вы вызываете write_file с такими аргументами:
Но вы не определили 'foo' правильно, или у вас есть опечатка в вашем коде, так что он создает новую пустую переменную и передает ее внутрь.
источник
Для меня это был случай, когда у меня была заводная шляпа вместо Python 3 была .
Забыли
return
ключевое слово в концеdef
функции.Я не программировал Python 3 всерьез пару месяцев. Думал, что последнее утверждение, оцененное в рутине, возвращалось согласно Groovy
Сделал несколько итераций, просматривая трассировку стека, вставляя
try: ... except TypeError: ...
блок отладки / пошаговое выполнение кода, чтобы выяснить, в чем дело.Решение для сообщения конечно не заставило ошибку выскакивать у меня.
источник