TypeError:'NoneType'对象在Python中是不可迭代的
错误TypeError: 'NoneType' object is not iterable
是什么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)
这意味着“数据”是无。
代码: for row in data:
错误消息: TypeError: 'NoneType' object is not iterable
它抱怨哪个对象? 两个, row
和data
。 在for row in data
,哪些需要迭代? 只有data
。
data
什么问题? 它的types是NoneType
。 只有None
才能inputNoneType
。 所以data is None
。
您可以在IDE中validation这一点,或者通过插入例如在for
语句之前print "data is", repr(data)
,然后重新运行。
想想下一步你需要做什么:应该如何表示“无数据”? 我们写一个空文件吗? 我们是否会提出exception或logging警告或保持沉默?
如何在python中重现这个错误:
Python方法将返回NoneType如果你期望从他们的元组,并没有返回任何东西来填补他们:
>>> def baz(): ... print("k") ... >>> a, b = baz() k Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'NoneType' object is not iterable
如果将NoneType分配给variables,也可以得到该错误:
>>> a = NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
如果您尝试在for循环中迭代NoneType,则会出现该错误:
>>> for i in NoneType: ... print("Yeah") ... Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
尝试连接None
和一个string,你会得到这个错误:
>>> bar = "something" >>> foo = None >>> print foo + bar TypeError: cannot concatenate 'str' and 'NoneType' objects
如果您使用包含NoneType的方法传递的variables,则会出现该错误:
>>> def foo(data): ... print(data) ... >>> foo(NoneType) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
这里是怎么回事? 谁,什么,几时,哪里,为什么,怎样?
Python解释器将上面的代码转换为pyc字节码,然后Python虚拟机的执行线遇到了for循环,这个循环调用了名为data
的variables的__iter__
方法。
data
的值为None,显然没有__iter__
方法,所以Python虚拟机正在告诉你它看到了什么:你提供给它的NoneType对象没有一个__iter__
方法,这个方法把我交给了一个迭代器。
这就是为什么Python的鸭子打字被认为是不好的原因。 你做了一件完全合理的事情,一个完全合理的例外随之而来,python虚拟机在地毯上堆起了一堆无关的废话。
Java没有这些问题,因为这样的程序甚至不会编译,因为你没有定义你的返回types,也没有指定在exception期间要做什么。
这意味着数据variables传递无(这是typesNoneType),它的等价物没有 。 所以它不能像列表那样迭代,就像你正在做的那样。
你用这样的参数调用write_file:
write_file(foo, bar)
但是你没有正确定义'foo',或者你的代码中有一个错字,所以它创build一个新的空variables并传入。
另一件可能产生这个错误的事情是,当你设置的东西等于函数返回的时候,却忘了实际返回任何东西。
例:
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)
这是有点难以发现的错误,因为如果在一次迭代中行variables恰好为无,也可能产生错误。 发现它的方法是在最后一行失败,而不是在函数内部。
如果你只从一个函数返回一个variables,我不知道是否会产生错误…我怀疑“NoneType”对象是不是Python中可迭代的“在这种情况下实际上是暗示”嘿,我试图迭代返回值,以便将它们分配给这三个variables,但我只是得到None来遍历“