2

下面的代码片段不断返回“NoneType is not 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 行,在 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”对象不可迭代

4

3 回答 3

3

if声明保证x.contacted不是无。

但这x.contacted不是您要迭代或索引的内容,因此它没有保护任何东西。

没有理由memotablememotable[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.contactedNone完全无关紧要的,因此您的支票不会在这里保护您。

如果您希望我们调试该函数中的问题,则必须向我们提供该函数的代码,而不是与错误无关的代码。也许这是一些愚蠢的事情,比如做a + b而不是return a + b最后,或者也许这是一些深刻的逻辑错误,但我们真的无法猜测。

于 2013-04-02T18:45:33.313 回答
0

检查 and 的值,memotable因为如果不是 None(没有代码) memotable[node.gen],则不能保证它们不是 None 。x.contacted

如果您在此处提及变量的值并发布完整的回溯,我们也许可以更准确地指出问题。

于 2013-04-02T18:49:48.510 回答
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
于 2013-04-02T19:31:38.173 回答