Как исправить ошибку «’builtin_function_or_method’ object is not subscriptable» в Python

Чтобы исправить ошибку «’builtin_function_or_method’ object is not subscriptable», убедитесь, что вы вызываете функцию или метод с помощью круглых, а не квадратных скобок.

Это распространенное сообщение об ошибке выглядит следующим образом:

'builtin_function_or_method' object is not subscriptable

Python выдает эту ошибку, когда после функции или метода используются квадратные скобки — []. Однако функции — это вызываемые объекты. Поэтому для них требуются круглые скобки — ().

Давайте рассмотрим пример, в котором Python выдает эту ошибку:

numbers = [2, 4, 6, 8]
numbers.append[10]
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

Суть ошибки

Функции Python — это вызываемые объекты. Это означает, что для выполнения кода, определенного в функции, мы можем вызвать ее, поставив круглые скобки после имени функции. Один из самых распространенных примеров встроенной функции в Python — print():

print("This is a built-in function")

# This is a built-in function

Для вызова функции в Python используются круглые скобки. А вот использование квадратных скобок вместо круглых приводит к ошибке:

print["This is a built-in function"]
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

Давайте разберем сообщение об ошибке на ключевые части:

  • ‘builtin_function_or_method’ object
  • Not subscriptable

В приведенном выше примере print() является встроенной функцией (англ. builtin function). В ее описании также упоминаются методы (англ. method) — функции, являющиеся частью класса.

Python имеет множество встроенных методов, связанных с типами данных. Давайте рассмотрим другой пример, в котором возникает это сообщение об ошибке:

name = "DataCamp"
print(name.count["a"])
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

Метод .count(), как и функции в целом, нуждается в круглых скобках:

print(name.count("a"))  # 3

Этот сценарий похож на пример из начала статьи, в котором используется метод списка .append(). Вот правильная версия с использованием круглых скобок:

numbers = [2, 4, 6, 8]
numbers.append(10)
print(numbers)  # [2, 4, 6, 8, 10]

TypeError: ‘function’ object is not subscriptable

В Python аналогичная ошибка возникает при использовании пользовательских функций:

def greet_person(name):
    print(f"Hello {person}")
   
greet_person["James"]
Traceback (most recent call last):
  ...
TypeError: 'function' object is not subscriptable

Функция greet_person() не является одной из встроенных функций Python. В сообщении об ошибке говорится, что это «function», а не «builtin_function_or_method».

Вторая часть сообщения об ошибке относится к термину «subscriptable». Объект Python является индексируемым (англ. subscriptable), если для доступа к его элементам мы можем использовать квадратные скобки. Обычным примером индексируемого объекта является список, к элементам которого можно обращаться с помощью индексов:

numbers = [2, 4, 6, 8, 10]

print(numbers[0])  # 2
print(numbers[-1])  # 10
print(numbers[1:4])  # [4, 6, 8]

Кортежи и строки — тоже примеры индексируемых последовательностей Python:

more_numbers = 10, 30, 50
print(more_numbers[0])  # 10
name = "DataCamp"
print(name[0])  # 'D'

Отображения в Python также являются индексируемыми. Наиболее распространенным отображением в Python является словарь:

points = {"James": 10, "Mary": 14}
print(points["Mary"])  # 14

Вместо индексов в квадратных скобках используются ключи словаря.

Объекты, которые можно вызывать, и объекты, которые можно проиндексировать

Последовательности и отображения — это примеры индексируемых объектов Python. Добавив квадратные скобки после имени объекта, мы можем получить доступ к его элементу(-ам). Класс Python создает индексируемые объекты, если в нем определен специальный метод .__getitem__().

Функции и методы — это примеры вызываемых объектов. Для их вызова мы можем использовать круглые скобки после имени объекта. Вызов функции или метода приводит к выполнению кода в определении функции.

Классы — это еще один вызываемый объект Python. При вызове класса создается его экземпляр. В целом, объект Python является вызываемым, если его класс определяет специальный метод .__call__().

Когда мы пытаемся вызвать объект, который не является вызываемым, Python выдает сообщение об ошибке:

numbers = [2, 4, 6, 8]
print(numbers(0))
Traceback (most recent call last):
  ...
TypeError: 'list' object is not callable

Переменная numbers — это список, который не является вызываемым. Правильный способ получить доступ к первому элементу списка — использовать квадратные скобки: numbers[0]. Функции, методы и классы — самые распространенные вызываемые объекты в Python.

Исправление ошибки «’builtin_function_or_method’ object is not subscriptable»

Python выдает сообщение об ошибке «’builtin_function_or_method’ object is not subscriptable», если после функции или метода стоят квадратные скобки. Для исправления ошибки замените квадратные скобки на круглые.

В некоторых случаях функция или метод имеет в качестве аргумента список, который определяется с помощью квадратных скобок. Но при этом нужно следить за тем, чтобы определение списка было взято в круглые скобки:

number_of_values = len([10, 30, 50])
print(number_of_values)  # 3
numbers = [2, 4, 6, 8]
numbers.extend([10, 12])
print(numbers)  # [2, 4, 6, 8, 10, 12]

В этих примерах за именем функции или метода следуют круглые скобки. Аргумент в круглых скобках представляет собой список. Нотация квадратных скобок для определения списка отличается от нотации квадратных скобок, используемой для последовательностей, отображений и других индексируемых объектов.

Советы по отладке

Можно проверить тип объекта с помощью встроенной функции type():

print(type(print))
numbers = [2, 4, 6, 8]
print(type(numbers.append))

# <class 'builtin_function_or_method'>

Вывод подтверждает, что объект является встроенной функцией или методом, а значит — вызываемым объектом. Существует также встроенная функция callable(), которая возвращает True, если ее аргумент может быть вызван:

print(callable(numbers.append))  # True

Другие советы по отладке:

  • Проверьте тип скобок. За именами вызываемых объектов, таких как функции и методы, должны следовать круглые скобки. Квадратные скобки используются для последовательностей, отображений и других индексируемых объектов.
  • Ищите в сообщении об ошибке подсказки, относящиеся к встроенным функциям или методам и индексируемым объектам. Номер строки в сообщении об ошибке указывает на строку, содержащую ошибку.

Заключение

Языки программирования, такие как Python, используют различные символы для разных целей. Квадратные скобки используются сразу после имени объекта для доступа к его элементам. Нотация квадратных скобок работает с индексируемыми объектами. Квадратные скобки, не стоящие за именем объекта, используются для создания списков.

Круглые скобки используются после имени объекта для его вызова. Функции и методы являются примерами вызываемых объектов в Python. В Python круглые скобки также связаны с кортежами и используются для группировки частей предложения, когда это необходимо.

Python вызывает исключение «’builtin_function_or_method’ object is not subscriptable», когда за встроенной функцией или методом следуют квадратные скобки. Правильным способом вызова функции или метода является использование круглых скобок.

Перевод статьи «How to Fix builtin_function_or_method’ object is not subscriptable».