TypeError: object of type 'function' has no len() 오류란?
파이썬에서 다음과 같은 오류 메시지를 본 적이 있으신가요?
TypeError: object of type 'function' has no len()
이 오류는 len() 함수에 함수 객체(function)를 전달했을 때 발생합니다. 즉, 리스트, 문자열, 딕셔너리처럼 길이를 측정할 수 없는 대상에 len()을 호출
대표적인 오류 상황 예제
def get_data():
return [1, 2, 3]
print(len(get_data)) # 오류 발생
이 코드는 get_data
라는 함수를 호출하지 않고 len()에 전달len(function)이 되어 오류가 발생합니다.
왜 이런 오류가 발생할까?
파이썬에서 함수 자체는 길이를 갖는 객체가 아니며, iterable도 아닙니다.
따라서 len(함수)
형태로 사용하면 다음과 같은 TypeError가 발생합니다.
TypeError: object of type 'function' has no len()
의도한 것은 아마도 함수의 결과물에 대해 길이를 구하려는 것이었을 겁니다. 위의 예제에서 올바른 코드는 다음과 같습니다:
print(len(get_data())) # 3
해결법 1: 함수 호출 여부 확인하기
이 오류를 해결하는 가장 일반적인 방법은 함수를 호출했는지 확인()를 붙였는지 체크하세요.
# 잘못된 예
len(my_function) # ❌ 함수 객체 자체
# 올바른 예
len(my_function()) # ✅ 함수 결과의 길이
중요 포인트: 함수 뒤에 ()
가 빠지면 그건 함수 '정의'를 가리키는 참조일 뿐입니다.
해결법 2: 변수명이 함수와 겹치지 않도록 주의하기
아래와 같은 상황에서도 같은 오류가 발생할 수 있습니다.
len = lambda x: x + 1 # len 함수를 덮어씀
my_list = [1, 2, 3]
print(len(my_list)) # TypeError 발생
여기서는 내장 함수 len()을 사용자가 재정의len은 더 이상 내장 함수가 아닌 사용자의 함수 객체
해결법: 내장 함수 이름은 변수명으로 사용하지 마세요. 실수로 재정의했다면 del len
으로 복구할 수 있습니다.
del len # 내장 len 함수 복구
실제 디버깅 팁
다음과 같은 방법으로 오류 원인을 빠르게 찾을 수 있습니다:
- type() 함수를 사용해 어떤 객체인지 확인
- len()을 호출할 때 함수 괄호 누락 여부 점검
- 내장 함수 이름을 덮어쓰지 않았는지 확인
print(type(get_data)) #
print(type(get_data())) #
보너스: 조건문에서 자주 발생하는 유사한 오류
함수를 조건문에서 사용할 때도 동일한 실수가 발생할 수 있습니다:
def get_names():
return []
if len(get_names) == 0: # 오류 발생
print("빈 리스트입니다.")
해결법: 함수를 호출한 결과에 대해 len()을 사용하세요.
if len(get_names()) == 0:
print("빈 리스트입니다.")
정리: 괄호 하나가 오류를 만든다
TypeError: object of type 'function' has no len() 오류는 대부분 함수를 호출하지 않고 len()에 전달했을 때 발생합니다.
이 오류는 단순해 보이지만, 디버깅에 꽤 시간을 잡아먹을 수 있습니다. 아래 팁을 기억하세요:
- len() 함수의 대상은 리스트, 문자열, 딕셔너리와 같은 시퀀스여야 합니다
- len(함수) → ❌, len(함수()) → ✅
- 내장 함수명을 변수명으로 쓰지 말 것
파이썬에서는 함수 자체는 길이를 갖지 않습니다. 항상 괄호를 통해 결과를 호출한 다음, 그 결과에 대해 len을 사용하세요.