Чтобы исправить ошибку «’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».