Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python TypeError: 'method' object is not subscriptable 오류 원인과 해결 방법

파이썬에서 메서드를 호출할 때는 반드시 소괄호 () 안에 인자를 지정해야 합니다. 함수와 메서드는 모두 소괄호를 통해 호출 여부를 판단하기 때문입니다. 만약 대괄호 []를 사용해 메서드를 호출하려 하면 TypeError: 'method' object is not subscriptable 오류가 발생합니다.

이 글에서는 이 오류가 의미하는 바와 발생 원인을 살펴보고, 실제 예제를 통해 해결 방법까지 단계별로 알아보겠습니다.

TypeError: 'method' object is not subscriptable이란?

파이썬에서 첨자 가능(subscriptable)한 객체__getitem__ 메서드를 구현하고 있는 객체를 말합니다. 리스트, 딕셔너리, 튜플 같은 자료형이 대표적입니다. __getitem__ 메서드 덕분에 파이썬 인터프리터는 컬렉션에서 개별 요소를 꺼낼 수 있습니다.

하지만 모든 객체가 첨자 가능한 것은 아닙니다. 메서드(method)는 __getitem__ 메서드를 구현하지 않기 때문에 첨자 가능한 객체가 아니며, 따라서 대괄호 문법으로 메서드 내부의 항목에 접근하거나 메서드를 호출할 수 없습니다.

다음 코드를 살펴보세요.

cheeses = ["Edam", "Stilton", "English Cheddar", "Parmesan"]
print(cheeses[0])

이 코드는 인덱스 0에 있는 치즈인 "Edam"을 출력합니다. 즉, 대괄호는 리스트에서 특정 위치의 값을 가져올 때 사용하는 문법입니다. 함수나 메서드는 첨자 가능한 객체가 아니므로 대괄호로 호출할 수 없습니다.

오류 발생 예시

치즈 정보를 객체로 저장하는 프로그램을 만들어 보겠습니다. 치즈를 정의하는 Cheese 클래스에는 특정 원산지 국가와 일치하는지 확인하는 메서드를 포함시킵니다.

먼저 치즈를 위한 클래스를 정의합니다. 클래스 이름은 Cheese로 하겠습니다.

class Cheese:
    def __init__(self, name, origin):
        self.name = name
        self.origin = origin

    def get_country(self, to_compare):
        if to_compare == self.origin:
            print("{} is from {}.".format(self.name, self.origin))
        else:
            print("{} is not from {}. It is from {}.".format(self.name, to_compare, self.origin))

이 클래스에는 두 가지 메서드가 있습니다. 첫 번째 __init__ 메서드는 Cheese 객체의 구조를 정의하고, 두 번째 get_country() 메서드는 치즈의 원산지가 특정 값과 일치하는지 확인해 줍니다.

다음으로 Cheese 클래스로 객체를 하나 생성합니다.

edam = Cheese("Edam", "Netherlands")

edam 변수는 객체입니다. 치즈 이름은 Edam이고, 원산지는 네덜란드(Netherlands)입니다.

이제 get_country() 메서드를 호출해 보겠습니다.

edam.get_country["Germany"]

이 코드는 Cheese 클래스의 get_country() 메서드를 실행하여, edam 객체의 "origin" 값이 "Germany"와 같은지 확인하려고 합니다. 코드를 실행하면 어떻게 될까요?

Traceback (most recent call last):
  File "main.py", line 14, in <module>
    edam.get_country["Germany"]
TypeError: 'method' object is not subscriptable

코드에서 오류가 발생했습니다.

해결 방법

파이썬 디버거가 오류로 지목한 코드 줄을 분석해 보겠습니다.

edam.get_country["Germany"]

이 코드에서는 대괄호 []를 사용해 get_country() 메서드를 호출하려 했습니다. 그러나 대괄호는 리스트 등 첨자 가능한 객체에서 항목에 접근할 때 사용하는 문법입니다. 함수와 메서드는 첨자 가능한 객체가 아니므로 대괄호로 호출할 수 없습니다.

이 오류를 해결하려면 대괄호를 소괄호 ()로 바꿔야 합니다.

edam.get_country("Germany")

코드를 다시 실행해 결과를 확인해 보겠습니다.

Edam is not from Germany. It is from Netherlands.

코드가 성공적으로 실행되었습니다. 이번에는 네덜란드를 전달해서, 지정한 값이 치즈의 원산지와 일치하는 경우에도 올바르게 동작하는지 확인해 보겠습니다.

edam.get_country("Netherlands")

실행 결과는 다음과 같습니다.

Edam is from Netherlands.

지정한 값이 치즈의 원산지와 일치하는 경우에도 코드가 정상적으로 작동합니다.

마무리

TypeError: 'method' object is not subscriptable 오류는 클래스 내부의 메서드를 대괄호로 호출하려 할 때 발생합니다. 이 오류를 해결하려면 호출하려는 메서드 이름 뒤에 반드시 소괄호 ()를 사용해야 합니다.

이제 이 흔한 파이썬 오류도 프로처럼 손쉽게 해결할 수 있을 것입니다!