2013-04-02 72 views
2

下面的代碼片段會一直返回「NoneType is not iterable」錯誤。爲什麼if語句不能解決這個問題?根據要求Python'if x is None'not catch NoneType None

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 

完全回溯:

Traceback (most recent call last):

File "F:\Dropbox\CS\a4\skeleton\trialtest.py", line 142, in test_legacy_and_frac()

File "F:\Dropbox\CS\a4\skeleton\trialtest.py", line 125, in test_legacy_and_frac cunittest2.assert_equals(set([n10,n12,n21]), t.legacy(n00,mtable))

File "F:\Dropbox\CS\a4\skeleton\trial.py", line 138, in legacy nset.union(self.legacy(x, memotable))

File "F:\Dropbox\CS\a4\skeleton\trial.py", line 138, in legacy nset.union(self.legacy(x, memotable))

TypeError: 'NoneType' object is not iterable

+2

請張貼全回溯。它有助於理解這個問題。 – pradyunsg

+1

你在迭代'x。在此之前聯繫過嗎?顯示更多代碼有助於。 –

+3

請將您的程序減少到仍然顯示錯誤的最短完整程序。然後將*程序複製粘貼到您的問題中。請參閱http://SSCCE.org瞭解更多信息。 –

回答

3

if聲明保證x.contacted不無。

x.contacted是不是你想要迭代或索引,所以它不守護任何東西。

沒有理由memotablememotable[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,或者這可能是一些深層的邏輯錯誤,但我們實在無法猜測。

+0

對不起,我應該發佈更多的代碼。 x.contacted(它是一個列表)在我添加的for語句中迭代。 – user2237405

+0

首先,它不是在你添加的'for'語句中迭代的。其次,回溯非常清楚地表明,例外情況出現在'legacy nset.union(self.legacy(x,memotable))'中。 – abarnert

0

檢查memotablememotable[node.gen]的值,因爲如果x.contacted不是None(無代碼),則不能保證它們不是None。

如果您在此提及變量的值併發布完整回溯,我們可能會更精確地指出問題。

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 
相關問題