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

Python 'TypeError: function 객체는 첨자를 사용할 수 없습니다' 오류 완벽 해결 가이드

반복 가능한(iterable) 객체와 달리, 함수에는 인덱싱 문법을 사용해 직접 값을 접근할 수 없습니다.

함수가 반복 가능한 객체를 반환하더라도, 그 값에 접근하려면 먼저 함수의 반환값을 변수에 할당해야 합니다. 그렇게 하지 않으면 "TypeError: 'function' object is not subscriptable" 오류가 발생합니다.

이 글에서는 해당 오류의 의미를 살펴보고, 두 가지 실제 예제를 통해 여러분의 코드에서 이 오류를 해결하는 방법을 단계별로 알아보겠습니다.

TypeError: 'function' object is not subscriptable란?

리스트나 문자열과 같은 반복 가능한 객체는 인덱싱 표기법을 사용해 접근할 수 있습니다. 이를 통해 반복 가능한 객체에서 개별 항목이나 특정 범위의 항목에 접근할 수 있습니다.

다음 코드를 살펴보겠습니다:

grades = ["A", "A", "B"]
print(grades[0])

인덱스 위치 0에 있는 값은 A입니다. 따라서 위 코드는 "A"를 반환합니다. 하지만 이 문법은 함수에는 적용되지 않습니다. 함수는 반복 가능한 객체가 아니기 때문입니다. 함수는 호출되었을 때에만 반복 가능한 객체를 반환할 수 있습니다.

"TypeError: 'function' object is not subscriptable" 오류는 함수를 마치 반복 가능한 객체처럼 취급하여 접근하려고 할 때 발생합니다.

이 오류는 주로 다음 두 가지 상황에서 발생합니다:

  • 반복 가능한 객체(변수)와 같은 이름으로 함수를 선언한 경우
  • 함수를 반복 가능한 객체처럼 취급하여 값에 접근하려고 한 경우

지금부터 두 가지 시나리오를 하나씩 자세히 분석해 보겠습니다.

시나리오 #1: 반복 가능한 객체와 같은 이름의 함수

학교에 재학 중인 학생의 정보를 출력하는 프로그램을 만들어 보겠습니다. 먼저 학생 정보와 최신 시험 점수가 담긴 딕셔너리를 정의합니다:

student = { "name": "Holly", "latest_test_score": "B", "class": "Sixth Grade" }

이 딕셔너리는 세 개의 키와 세 개의 값을 가집니다. 하나의 키는 학생의 이름을, 다른 키는 학생의 최신 시험 점수를, 마지막 키는 학생이 속한 학년을 나타냅니다.

다음으로, 이 값들을 콘솔에 출력하는 함수를 정의해 보겠습니다:

def student(pupil):
	print("Name: " + pupil["name"])
	print("Latest Test Score: " + pupil["latest_test_score"])
	print("Class: " + pupil["class"])

이 코드는 "pupil" 딕셔너리의 세 값을 콘솔에 출력하며, "pupil" 딕셔너리는 student() 함수의 인자로 전달됩니다.

이제 함수를 호출하고 "student" 딕셔너리를 매개변수로 전달해 보겠습니다:

student(student)

그러면 Python 코드에서 다음과 같은 오류가 발생합니다:

Traceback (most recent call last):
  File "main.py", line 8, in <module>
	student(student)
  File "main.py", line 4, in student
	print("Name: " + pupil["name"])
TypeError: 'function' object is not subscriptable

오류 원인 분석

이 오류는 함수와 반복 가능한 객체가 같은 이름을 가지고 있기 때문에 발생합니다. "student"는 처음에 딕셔너리로 선언되었지만, 이후 같은 이름의 함수를 정의하면서 "student"는 더 이상 딕셔너리가 아닌 함수가 되어 버렸습니다.

따라서 "student"를 student() 함수의 매개변수로 전달할 때, 실제로는 딕셔너리가 아닌 "student"라는 이름의 함수가 전달되는 것입니다.

해결 방법: 함수 이름 변경

이 문제는 student 함수의 이름을 변경하여 해결할 수 있습니다:

def show_student_details(pupil):
	print("Name: " + pupil["name"])
	print("Latest Test Score: " + pupil["latest_test_score"])
	print("Class: " + pupil["class"])

show_student_details(student)

함수 이름을 "show_student_details"로 변경했습니다. 코드를 실행하면 어떻게 되는지 확인해 보겠습니다:

Name: Holly
Latest Test Score: B
Class: Sixth Grade

이제 코드가 성공적으로 학생 정보를 콘솔에 출력합니다.

시나리오 #2: 인덱싱으로 함수 접근하기

이번에는 학생 기록 목록을 필터링하여 최신 시험에서 A 등급을 받은 학생만 표시하는 프로그램을 작성해 보겠습니다.

먼저 학생 배열을 정의합니다:

students = [
	{ "name": "Holly", "grade": "B" },
	{ "name": "Samantha", "grade": "A" },
	{ "name": "Ian", "grade": "A" }
]

학생 목록에는 세 개의 딕셔너리가 포함되어 있으며, 각 딕셔너리는 학생의 이름과 최신 시험에서 받은 등급을 담고 있습니다.

다음으로, A 등급을 받은 학생 목록을 반환하는 함수를 정의합니다:

def get_a_grade_students(pupils):
	a_grade_students = []
	for p in pupils:
    		if p["grade"] == "A":
        			a_grade_students.append(p)

	print(a_grade_students)

	return a_grade_students

이 함수는 "pupils"라는 학생 목록을 인자로 받습니다. for 루프를 사용해 목록을 순회하며, 특정 학생이 "A" 등급을 받았다면 해당 학생의 기록을 "a_grade_students" 리스트에 추가합니다.

모든 학생을 검색한 후, 코드는 A 등급을 받은 학생 목록을 출력하고 그 리스트를 메인 프로그램으로 반환합니다.

오류가 발생하는 코드

A 등급을 받은 첫 번째 학생을 조회하고 싶다고 가정해 보겠습니다. 이를 위해 함수를 호출하고 인덱싱 문법으로 첫 번째 학생의 기록을 가져오려 합니다:

first = get_a_grade_students[0]

print(first)

코드를 실행하면:

Traceback (most recent call last):
  File "main.py", line 16, in <module>
	first = get_a_grade_students[0]
TypeError: 'function' object is not subscriptable

코드에서 오류가 반환됩니다. "get_a_grade_students" 함수를 먼저 호출하지 않은 상태에서 함수로부터 값을 가져오려고 했기 때문입니다.

해결 방법: 함수를 먼저 호출하기

이 문제는 값을 조회하기 전에 함수를 먼저 호출함으로써 해결할 수 있습니다:

a_grades = get_a_grade_students(students)
first = a_grades[0]

print(first)

먼저 get_a_grade_students() 함수를 호출하고 학생 목록을 매개변수로 지정합니다. 다음으로, 인덱싱을 사용해 get_a_grade_students() 함수가 반환한 리스트에서 인덱스 위치 0의 기록을 가져옵니다. 마지막으로 그 기록을 콘솔에 출력합니다.

코드를 실행해 보겠습니다:

[{'name': 'Samantha', 'grade': 'A'}, {'name': 'Ian', 'grade': 'A'}]
{'name': 'Samantha', 'grade': 'A'}

코드는 먼저 A 등급을 받은 모든 학생의 목록을 출력합니다. 그다음, A 등급을 받은 학생 목록 중 첫 번째 학생을 출력합니다. 이 경우 그 학생은 Samantha입니다.

마무리

"TypeError: 'function' object is not subscriptable" 오류는 문자열이나 리스트처럼 함수를 반복 가능한 객체로 취급하여 항목에 접근하려고 할 때 발생합니다.

이 오류를 해결하려면, 첫째, 변수를 선언한 후 같은 이름의 함수를 선언하여 값을 저장하는 변수를 덮어쓰지 않았는지 확인하세요. 둘째, 함수가 반환하는 값에 접근하기 전에 반드시 함수를 먼저 호출했는지 확인하세요.

이제 여러분도 전문 개발자처럼 이 흔한 Python 오류를 손쉽게 해결할 수 있을 것입니다!