2013-04-02 2 views
2

아래의 코드 스 니펫은 "NoneType is iterable not"오류를 계속 반환합니다. if 문이 왜 이것을 잡지 못하는 걸까요? 요청에 따라Python 'x가 None이면'잡기가 없습니다. NoneType

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 

전체 역 추적 : x.contacted가 없음되지 없다는 것을

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이 다른 경우에도 memotable 또는 memotable[node.gen]None 일 수 없습니다. 그렇다면 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이든간에 여기에 전혀 관련이 없으므로 여기를 확인하지 않아도됩니다.

우리가 그 함수에서 문제를 디버그하기를 원하면 오류와 아무 관련이없는 코드 대신 그 함수에 코드를 제공해야합니다. 어쩌면 결국 return a + b 대신 a + b을 수행하는 것과 같은 어리석은 짓일 수도 있고, 아니면 심각한 논리 오류 일 수도 있습니다. 그러나 우리가 실제로 추측 할 수있는 방법은 없습니다.

+0

죄송합니다. 더 많은 코드를 게시해야합니다. x.contacted (목록)는 내가 추가 한 for 문에서 반복됩니다. – user2237405

+0

먼저, 추가 한 for 문에서 iterated가되지 않습니다. 두 번째로, traceback은 아주 예외적으로 예외가'legacy nset.union (self.legacy (x, memotable))'에 있다고 말한다. – abarnert

0

x.contacted이 None (코드 없음)이 아닌 경우 None이 아니라고 보장 할 수 없으므로 memotablememotable[node.gen]의 값을 확인하십시오.

여기서 변수의 값을 언급하고 전체 추적을 게시하면 더 정확하게 문제를 지적 할 수 있습니다.

0

self.legacy(x, memotable) 함수 호출이 None을 반환하기 때문에 예외가 발생합니다.

nset.union(self.legacy(x, memotable))에 오류가 발생했음을 나타냅니다. set.union()은 인수가 None 인 경우 해당 예외를 발생시킵니다. (나는 nset을 가정하고있어 귀하의 코드가 inset = set()을 정의합니다. set이지만, nset의 출처 표시되지 않습니다)

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