Python/Debugging

TypeError: 'function' object is not subscriptable 해결

jimmy_AI 2022. 3. 30. 20:13
반응형

파이썬 object is not subscriptable 오류에 대하여

지난 글에서 [] 괄호와 () 괄호의 역할을 구분하며

[] 괄호를 이용한 인덱싱 대신 () 괄호를 사용한 호출을 진행하면 발생하는

object is not callable 종류의 오류를 살펴보았습니다.

 

TypeError: 'list' object is not callable 원인과 해결법

파이썬 object is not callable 에러 디버깅 리스트 인덱싱 등 과정에서 자주 등장할 수 있는 오류 종류인 '~~ object is not callable' 종류의 오류의 의미와 원인에 대해서 살펴보고 해결 방법을 파헤쳐보도

jimmy-ai.tistory.com

 

이번 글에서는 반대로 () 괄호로 호출을 해야하는 함수 등 객체에 대하여

[] 괄호를 통한 인덱싱을 수행하면 발생할 수 있는 object is not subscriptable 종류의

에러에 대해서 다루어보도록 하겠습니다.

 

 

에러 발생 원인

아래와 같은 간단한 함수들이 있다고 가정할 때, () 괄호 내에 input argument를 차례대로

넣어주는 방식을 통하여 함수를 호출하게 됩니다.

# 함수 예시
def foo(num):
    return num + 1

def goo(num1, num2):
    return num1 + num2

# 올바른 호출 방법
foo(2) # 3
goo(2, 5) # 7

그러나, 만일 여기서 리스트나 문자열 등 객체의 인덱싱, 슬라이싱 역할을 수행하는

[] 괄호를 통해서 함수 호출을 시도하면 아래와 같은 오류가 발생하게 됩니다.

반응형
foo[2] # []로 함수 호출 시도

# 출력 메시지
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-206041a63208> in <module>()
----> 1 foo[2]

TypeError: 'function' object is not subscriptable

이에 대한 원인은 함수 객체가 인덱싱 연산을 지원하지 않는 것으로 봐주시면 됩니다.

 

참고로, 인덱싱/슬라이싱 등의 연산을 지원하지 않는 다른 종류의 객체에 대해서도

[] 괄호 적용을 시도할 경우 위에서 다루었던 종류의 오류가 동일하게 발생합니다.

# [] 연산을 지원하지 않는 객체에 적용 시도 예시

x = None # NoneType
y = 123 # 정수
z = 2.5 # 실수

x[0] # TypeError: 'NoneType' object is not subscriptable
y[1] # TypeError: 'int' object is not subscriptable
z[2] # TypeError: 'float' object is not subscriptable

 

 

오류 해결법

위 종류의 에러는 괄호의 역할을 구분하여 () 괄호로 올바르게 함수 호출을 진행하거나,

인덱싱(슬라이싱)이 가능한 자료형으로 변환 후 [] 괄호 적용을 시도해주시면 해결됩니다.

def foo(num):
    return num + 1

foo(2) # 올바른 함수 호출 형태

y = 123

str(y)[1] # 정수형 -> 문자열 변환 후 인덱싱