다음과 같은 에러가 났다.
(환경: CentOS, 언어: 파이썬)
다시 말하지만, 컴파일러(인터프리터)의 에러 메세지는 언제나 거의 정확하다. 에러 메세지를 이해해 보면 이렇다.
에러가 난 곳을 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 에러가 날 수밖에 없었던 것이다.
(환경: 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
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 에러가 날 수밖에 없었던 것이다.
'컴퓨터 > 디버깅' 카테고리의 다른 글
unresolved external symbol (0) | 2010.04.19 |
---|---|
Debug Assertion Failed! (0) | 2010.04.19 |
no match for ‘operator<’ in ‘__x < __y’ (0) | 2010.04.15 |
l-value specifies const object (0) | 2010.04.13 |
명확하지 않게 다가오는 컴파일 에러 메세지들과 그 뜻 (0) | 2009.12.30 |