반복 가능한 객체와 달리 인덱싱 구문을 사용하여 함수의 값에 액세스할 수 없습니다.
함수가 iterable을 반환하더라도 값에 액세스하기 전에 함수의 응답을 변수에 할당해야 합니다. 그렇지 않으면 "TypeError:'function' object is not subscriptable" 오류가 발생합니다.
이 가이드에서는 이 오류의 의미에 대해 설명합니다. 코드에서 이 오류를 해결하는 방법을 알아낼 수 있도록 이 오류의 두 가지 예를 살펴봅니다.
TypeError:'function' 개체는 첨자할 수 없습니다.
목록 및 문자열과 같은 반복 가능한 객체는 인덱싱 표기법을 사용하여 액세스할 수 있습니다. 이를 통해 iterable에서 개별 항목 또는 항목 범위에 액세스할 수 있습니다.
다음 코드를 고려하십시오.
grades = ["A", "A", "B"] print(grades[0])
인덱스 위치 0의 값은 A입니다. 따라서 코드는 "A"를 반환합니다. 이 구문은 함수에서 작동하지 않습니다. 이는 함수가 반복 가능한 객체가 아니기 때문입니다. 함수는 호출된 경우에만 반복 가능한 객체를 반환할 수 있습니다.
"TypeError:'function' object is not subscriptable" 오류는 반복 가능한 개체인 것처럼 함수에 액세스하려고 할 때 발생합니다.
이 오류는 두 가지 시나리오에서 일반적입니다.
참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.
부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.
- 함수를 iterable과 같은 이름으로 할당하는 경우
- 함수가 반복 가능한 것처럼 함수의 값에 액세스하려고 할 때
이 두 가지 시나리오를 모두 분석해 보겠습니다.
시나리오 #1:Iterable과 이름이 같은 함수
학교에서 학생에 대한 정보를 인쇄하는 프로그램을 만듭니다. 먼저 학생에 대한 정보와 최신 시험 점수로 사전을 정의합니다.
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"라는 이름의 함수를 전달합니다.
학생 함수의 이름을 변경하여 이 문제를 해결합니다.
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" } ]
학생 목록에는 3개의 사전이 있습니다. 각 사전에는 학생의 이름과 가장 최근 시험에서 얻은 성적이 포함되어 있습니다.
다음으로 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 오류를 해결할 준비가 되었습니다!