以下代码段不断返回“NoneType is iterable”错误。 if语句为什么不抓住这个?
inset = set()
for x in node.contacted:
print type(x)
if x.is_converted() is True:
nset.add(x)
if x.contacted is None:
memotable[node.gen][node.genind] = nset
else:
nset.union(self.legacy(x, memotable))
memotable[node.gen][node.genind] = nset
按要求完全追溯:
追踪(最近一次呼叫最后一次):
文件“F:\ Dropbox \ CS \ a4 \ skeleton \ trialtest.py”,第142行,in test_legacy_and_frac()
文件“F:\ Dropbox \ CS \ a4 \ skeleton \ trialtest.py”,第125行,in test_legacy_and_frac cunittest2.assert_equals(set([n10,n12,n21]),t.legacy(n00,mtable))
传统文件“F:\ Dropbox \ CS \ a4 \ skeleton \ trial.py”,第138行 nset.union(self.legacy(x,memotable))
传统文件“F:\ Dropbox \ CS \ a4 \ skeleton \ trial.py”,第138行 nset.union(self.legacy(x,memotable))
TypeError:'NoneType'对象不可迭代
答案 0 :(得分:3)
if
语句保证x.contacted
不是无。
但是x.contacted
不是你想要迭代或索引的东西,所以它不守护任何东西。
memotable
或memotable[node.gen]
无法成为None
,即使x.contacted
是其他内容。就此而言,我们不知道self.legacy(x, memotable)
中的代码是做什么的 - 也许它会尝试迭代x
或other_table[x]
,或者谁知道什么,其中任何一个都可能None
1}}。
这就是为什么你需要查看整个回溯,而不仅仅是错误字符串。它会告诉您确切的哪个语句失败,以及原因。
现在你已经粘贴了追溯:
File "F:\Dropbox\CS\a4\skeleton\trial.py", line 138, in legacy nset.union(self.legacy(x, memotable))
是的,这是在self.legacy
行内发生的事情,它与x.contacted
完全无关。几乎可以肯定,您的self.legacy
方法正在返回None
,因此您正在执行nset.union(None)
。
同样,x.contacted
是否None
在这里完全无关紧要,所以你的支票不会在这里保护你。
如果您希望我们在该函数中调试问题,您必须向我们提供该函数的代码,而不是与错误无关的代码。也许这是愚蠢的事情,比如在最后做a + b
而不是return a + b
,或者可能是一些深刻的逻辑错误,但我们真的无法猜测。
答案 1 :(得分:0)
检查memotable
和memotable[node.gen]
的值,因为如果x.contacted
不是None(没有代码),则无法保证它们不是None。
如果你在这里提到变量的值和Post the Full Traceback,我们可能会更准确地指出问题。
答案 2 :(得分:0)
发生异常是因为函数调用self.legacy(x, memotable)
返回None
。
回溯表示nset.union(self.legacy(x, memotable))
发生错误,set.union()
在其参数为None
时引发该异常。 (我假设nset
是set
。您的代码定义了inset = set()
,但没有显示nset
来自哪里
>>> set().union(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable