파이썬 프로그래밍을 하다보면 겪는 어려움 중에 타입(Type)과 관련된 에러가 있다. 컴파일 언어의 경우 소스코드를 작성할 때, IDE에서 대부분의 잠재적인 타입 에러를 잡아주기 때문에 깊이 생각하지 않아도 되는 문제들이 파이썬 같은 동적 언어에서는 문제가 될 수 있다. IDE에서는 문제가 없었지만 런타임에 에러를 발생시키는 경우가 종종있다.
그 중에 하나가 'TypeError: 'NoneType' object is not iterable'에러다. 파이썬에서 반복문에 사용할 객체를 얻어오는 과정에서 발생하는 에러다.
다음 파이썬 코드를 보자.
def function1(param1):
if param1 == 1:
return "abc"
elif param2 == 2:
return "def"
elif param2 == 3:
return "ghi"
value = 1
for char in function1(value):
print(char)
function1() 함수를 통해 인자로 받은 숫자에 대응되는 문자열을 리턴받아 문자열을 구성하고 있는 문자들을 하나씩 출력하는 간단한 코드다. 이 코드를 실행하면
a
b
c
이런 결과를 얻을 수 있다.
문제는 function1() 함수의 인자로 1, 2, 3이 아닌 다른 값을 지정했을 경우에 발생한다. 만약 4라는 값을 지정했을 경우
TypeError: 'NoneType' object is not iterable
TypeError를 만나게 된다. 반복문에서 사용할 객체는 iterable 객체여야한다. 문제는 function1() 함수에서 인자로 4를 받았을 때 리턴하는 값이다.
파이썬의 함수가 아무것도 리턴하지 않은 경우 None이라는 값을 리턴하게 된다. 인자를 4로 넘겨주면 그에 맞는 if 구문이 없어 명시적으로 리턴하지 않고 종료된다. 때문에 function1() 함수의 리턴 값은 None이다. 문제는 이 None이라는 값은 iterable 값이 아니기 때문에 반복문에서 사용할 수 없다.
함수에서 리턴해주는 값을 사용할 때, None이 리턴될 수 있는지 확인하고 명시적인 리턴문이 없는 경우엔 None이 리턴될 수 있음을 인지하고 사용하자.
댓글