본문 바로가기
컴퓨터/디버깅

Iteration over non-sequence

by adnoctum 2010. 4. 16.
다음과 같은 에러가 났다.

(환경: CentOS, 언어: 파이썬)

Traceback (most recent call last):
  File "./split_material_from_trial_no_01.py", line 54, in ?
    main();
  File "./split_material_from_trial_no_01.py", line 47, in main
    for m in all_material_sorted:
TypeError: iteration over non-sequence


다시 말하지만, 컴파일러(인터프리터)의 에러 메세지는 언제나 거의 정확하다. 에러 메세지를 이해해 보면 이렇다.

에러가 난 곳을 traceback, 즉 역추적해 들어 가는 과정이 나와 있는데, split_materia...py 파일의 54번째 줄 (그 줄은 main 함수 안쪽인데)에서 에러가 났고, 다시 그 함수에서 어떤 함수를 호출했는지 어쨌는지 split_materia...py 함수의 47번째 줄로 이동을 했고, 그 곳에서

for m in all_material_sorted:

이 구문을 실행하려고 했는데,

TypeError: iteration over non-sequence

이런 에러가 났다는 것이다. 에러의 의미는, non-sequence 에 대해서 iteration 을 달라고 한 것이다. 즉, 시퀀스처럼 여러 객체가 연이어 저장되어 있는 구조에 대해서만 iterator 를 받아서 각 개체를 순회할 수 있는 것인데, 지금은 시퀀스가 아닌 개체에 대해서 iterator 를 달라고 한 것이다. 파이썬 내부적으로

for m in all_material_sorted:

위 구문은 all_material_sorted 개체의 iterator 를 받아서 일을 처리할텐데, 현재 all_material_sorted 가 sequence 가 아니므로 iterator 를 반환할 수 없었던 것이다 (실제로는 type-mismatch). 왜 그럴까? 실제로 에러가 난 코드를 보면 다음과 같다.



내가 약간의 실수를 한 것인데, 45번째 줄에서 sorted 함수를 사용하면 list 가 넘어 왔었기 때문에 all_material_sorted 에 그 리스트를 받은 후, 47번째 줄에서 이 리스트를 순회할 수 있었다. 그러나 45번째 줄을 주석처리한 후, 46번째 줄에서처럼 현재 list인 all_material 를 가지고 sort 를 호출했다. 리스트 객체의 sort 함수 반환값은, 없다. (a = [1,3,2]; b = a.sort(); type(b)로 확인 가능). 그러므로 위에서 46번째 줄이 끝나면 all_material_sorted 변수는 NoneType 인 것이다. 이 타입은 iterator를 가질 수 없겠지. 그래서 47번째 줄에서 결국 type-mismatch 에러가 날 수밖에 없었던 것이다.