下面的代码片段不断返回“ 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)中的代码的作用-可能是它试图迭代xother_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,或者这是一些深层的逻辑错误,但实际上我们无法猜测。

10-06 09:54