TypeError: 'NoneType' object is not iterable
是什么意思? 例如:
for row in data: # Gives TypeError!
print(row)
这意味着data
的值是None
。
for
循环而不是引发异常。Python在这里的设计存在缺陷。当将None
视为可迭代对象时,它至少必须返回一个空列表。这个异常在现实生活中从来没有帮助过任何人,除了让我们插入一些丑陋的处理方式,比如if data is not None:
。 - nehemDictWriter
的fieldlist
是None
,就会发生这种情况! - Arklurfor i in data or []
。这段代码的意思是,如果data
是可迭代对象,则对其进行迭代操作;否则,迭代一个空列表。 - BMWdata
是否为None
,而是让异常发生。您希望API的使用者知道他们何时使用不正确。接受None
作为空序列会让像mylist = mylist.extend(morestuff)
这样的错误更长时间地隐藏; 他们认为自己扩展了一个列表(他们确实这样做了,但立即用None
替换它),然后将其传递给OP的函数,并想知道为什么文件是空的,没有任何错误被引发。 - ShadowRanger在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.
for a in None:
print("k") #TypeError: 'NoneType' object is not iterable
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
Guido建议仅使用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
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的变量进行迭代。操作通过在None上调用__iter__
方法来执行。
由于None没有定义__iter__
方法,因此Python虚拟机告诉您它看到的内容:NoneType没有__iter__
方法。
这就是为什么Python的鸭子类型思想被认为是不好的原因。程序员使用一个变量做了完全合理的事情,在运行时,它被None污染了,Python虚拟机试图继续运行,然后在地毯上吐了一堆无关的废话。
Java或C ++没有这些问题,因为这样的程序不会被编译,因为你还没有定义当出现None时该怎么做。Python允许程序员做很多在特殊情况下不能期望工作的事情,这给了程序员很大的自由度。Python是一个顺从的人,如果应该阻止您自我伤害,它说“是的,先生”,就像Java和C++那样。
NoneType
和 None
(b) 认为 NameError: name 'NoneType' is not defined
和 TypeError: cannot concatenate 'str' and 'NoneType' objects
与 TypeError: 'NoneType' object is not iterable
是相同的
(c) Python 和 Java 的比较是 "一堆不相关的废话" - John Machinnull
,Java基本上会面临相同的问题。C++在使用nullptr
时也会遇到同样的问题(尽管通常只是在没有报告原因的情况下以分段错误崩溃)。尽管好的C++代码很少使用指针,但你展示的是不良Python代码,而糟糕的C++代码也可能在运行时由于空值而出错。Python在这里做得很正确;它并没有“继续前进”,而是在你尝试使用None
无法完成的任何操作时立即报错。你的问题不在于Python,而在于动态类型语言。 - ShadowRanger代码: 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 中验证这一点,或者在 for
语句之前插入例如 print "data is", repr(data)
并重新运行。
思考接下来需要做什么: 如何表示“没有数据”?我们写一个空文件吗?我们抛出异常或记录警告或保持沉默?
导致此错误的另一种情况是您将某物设置为从函数返回的内容,但忘记了实际返回任何内容。
例如:
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' object is not iterable in Python"实际上是在暗示"嘿,我正在尝试迭代返回值以按顺序将它们分配给这三个变量,但我只得到了None来迭代"
for row in data or []:
。 - Markif data is None: raise
。 - nehem您正在调用write_file函数,参数如下:
write_file(foo, bar)
但是你没有正确定义 'foo',或者你的代码中有拼写错误,导致它创建一个新的空变量并将其传递了进去。
def
函数的末尾忘记了return
关键字。try: ... except TypeError: ...
块进行调试/逐步执行代码,才能找出问题所在。data
是None
,不可迭代。添加一个or []
*可以防止异常并且不会输出任何内容:for row in data or []: # no more TypeError!
print(row)
* 感谢之前的评论;请注意,引发异常可能也是期望的行为,或者是不当数据
设置的指示器。
这还取决于您使用的Python版本。在我的情况下,Python 3.6和Python 3.8会抛出不同的错误消息,如下所示:
(a,b) = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable
(a,b) = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot unpack non-iterable NoneType object
因为使用for循环时,结果只是一个值而不是一组值。
pola.py
@app.route("/search")
def search():
title='search'
search_name = request.form.get('search')
search_item = User.query.filter_by(id=search_name).first()
return render_template('search.html', title=title, search_item=search_item )
{% for p in search %}
{{ p }}
<td>{{ search_item }}</td>
None
强制转换为序列时,它应该产生一个空序列,完全没有危害。 - nehemNone
永远不会被强制转换成任何类型。让None
像其他类型一样悄无声息地执行会隐藏错误,这恰好与“无害”相反。如果你需要一个代表空序列的falsy占位符,可以使用()
或''
/""
,它们都是单例并且可以像None
一样廉价地加载。如果想要将任何falsy值默认视为空序列,可以使用for row in data or ():
,但没人这样做,因为将None
传递给期望序列的函数会产生错误,不应该悄悄地通过。 - ShadowRangerstr
可以被视为可迭代对象,那么将None强制转换为空迭代对象有什么问题,特别是在意图明确的情况下。更糟糕的是,列表和字典可以被强制转换为布尔值,甚至字符串也可以。强类型对于布尔值并没有很好地保持。 - nehem