Python'if x is None'没有捕获NoneType

时间:2013-04-02 18:43:31

标签: python python-2.7

以下代码段不断返回“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'对象不可迭代

3 个答案:

答案 0 :(得分:3)

if语句保证x.contacted不是无。

但是x.contacted不是你想要迭代或索引的东西,所以它不守护任何东西。

memotablememotable[node.gen]无法成为None,即使x.contacted是其他内容。就此而言,我们不知道self.legacy(x, memotable)中的代码是做什么的 - 也许它会尝试迭代xother_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)

检查memotablememotable[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时引发该异常。 (我假设nsetset。您的代码定义了inset = set(),但没有显示nset来自哪里

>>> set().union(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable