typeError:'nontype'对象在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)
解决方案
这意味着价值 data
是 None
.
其他提示
错误的说明:“非型”对象是不可能的
在Python2中,非类型是无类型。例如,在Python3中,非类型是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
Python方法如果不返回值,则返回非类型:
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
非视频是偷偷摸摸的,可以从Lambdas偷偷摸摸:
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虚拟机处理了字节码,它遇到了一个循环构造,该构造在包含无的变量上迭代。该操作是通过调用 __iter__
无。
没有人没有 __iter__
定义的方法,因此Python的虚拟机告诉您它看到了什么:非类型没有 __iter__
方法。
这就是为什么 python的鸭子型 意识形态被认为是不好的。程序员使用变量做得完全合理,并且在运行时不会被无污染,Python虚拟机尝试士兵,并在地毯上撒了一堆无关的胡说八道。
Java或C ++没有这些问题,因为这样的程序不允许编译,因为您没有在没有发生时定义该怎么做。 Python为程序员提供了很多绳索来悬挂自己,因为您可以做很多在特殊情况下不能期望工作的事情。 python是一个是的人,当它阻止您伤害自己时说“是”,例如Java和C ++。
代码: 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中或通过插入EG进行验证 print "data is", repr(data)
之前 for
声明和重新运行。
考虑下一步需要做什么: 应该如何表示“无数据”?我们写一个空文件吗?我们会提出例外还是记录警告或保持沉默?
可能会产生此错误的另一件事是,当您设置与函数返回相同的东西时,但忘记了实际返回任何内容。
例子:
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)
这是一个很难发现的错误,因为如果行变量恰好在其中一个迭代中,则可能会产生错误。发现它的方法是,痕迹在最后一行而不是在函数内部失败。
如果您只从函数返回一个变量,我不确定是否会产生错误...我怀疑错误“'nontype'对象在python中是不可能的”,在这种情况下,我实际上意味着“嘿,我正在尝试迭代返回值以按顺序将它们分配给这三个变量,但我只能迭代遍历”
这意味着数据变量是通过无(类型非类型)的,其等效的 没有. 。因此,就像您试图做的那样,它作为列表不可能。
您正在用这样的参数调用write_file:
write_file(foo, bar)
但是您尚未正确定义“ foo”,或者您的代码中有错别字,因此它正在创建一个新的空变量并将其传递给。
对我来说,这是我的 Groovy帽子 在代替python 3上。
忘了 return
关键字在 def
功能。
几个月来一直没有认真地编码Python 3。正在思考以常规评估的最后一份声明正在以凹陷的方式返回。
进行了一些迭代,看着堆栈痕迹,插入 try: ... except TypeError: ...
阻止调试/踏入代码,以找出出了什么问题。
消息的解决方案当然并没有使我对我跳出来。