下面的代码片段不断返回“ NoneType不可迭代”错误。 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行,在
test_legacy_and_frac()
文件“ F:\ Dropbox \ CS \ a4 \ skeleton \ trialtest.py”,第125行,在
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”对象不可迭代
最佳答案
if
语句保证x.contacted
不为None。
但是x.contacted
不是您要迭代或索引的内容,因此它没有任何保护作用。
即使memotable
是其他名称,也没有理由memotable[node.gen]
或None
不能为x.contacted
。因此,我们不知道self.legacy(x, memotable)
中的代码的作用-可能是它试图迭代x
或other_table[x]
,或者是谁知道什么,其中任何一个都可能是None
。
这就是为什么您需要查看整个追溯,而不仅仅是错误字符串的原因。它会准确告诉您哪个语句失败以及原因。
现在,您已经粘贴了追溯:
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
,或者这是一些深层的逻辑错误,但实际上我们无法猜测。