Гид по технологиям

TypeError: object is not subscriptable — как найти и исправить ошибку в Python

• 4 min read • Python • Обновлено 06 Dec 2025
TypeError: object is not subscriptable — как исправить
TypeError: object is not subscriptable — как исправить

Человек использует ноутбук MacBook рядом с книгой по Python на стуле

Что означает “subscriptable” в Python

Subscriptable — это объект, который хранит несколько значений или допускает доступ по индексам/ключам с помощью квадратных скобок ([]). Классические примеры: строка, список, кортеж, словарь. Если тип не поддерживает операцию индексирования, Python выбрасывает TypeError: object is not subscriptable.

Определение в одну строку: subscriptable = объект, у которого можно вызвать obj[index] или obj[key].

Какие типы индексируемы

Примеры индексируемых типов и простые обращения к элементам:

list_example = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"name": "Idowu", "Language": "Yoruba"}

print(list_example[0])   # 1
print(string_example[3]) # o
print(tuple_example[1])  # 3
print(dict_example["name"]) # Idowu

Подсказка: у словаря индексирование происходит по ключу, а не по числовому индексу.

Типы, которые не поддерживают индексирование

Сюда относятся числа, булевы значения и множества. Попытка доступиться к ним через [] вызовет ту самую ошибку.

float_example = 12.45
int_example = 12367
bool_example = True
set_example = {1, 3, 5, "Python"}

print(float_example[1])
print(bool_example[2])
print(int_example[2])
print(set_example[2])

При выполнении вы увидите TypeError: ‘float’ object is not subscriptable (или аналогичный для int/bool/set).

Как отлаживать и разрешать ошибку: чеклист

  1. Выведите type(obj) для объекта, к которому применяете [].
  2. Подумайте: должен ли объект быть последовательностью или отображением? Если да — почему он не тот тип?
  3. Либо преобразуйте тип в индексируемый (str, list, tuple, dict), либо используйте другой способ доступа.
  4. Покройте преобразования тестами, чтобы не сломать поведение при изменении данных.

Пример проверки типа:

print(type(float_example))  # 
print(type(int_example))    # 
print(type(bool_example))   # 
print(type(set_example))    # 

Преобразование типов, чтобы сделать их subscriptable

  • Для чисел и булевых значений: преобразуйте в строку, затем индексируйте.
float_example = 12.45
int_example = 12367
bool_example = True

print(str(float_example)[:2])  # '12'
print(str(int_example)[:2])    # '12'
print(str(bool_example)[:2])   # 'Tr'

Если нужно вернуть числовой тип после извлечения фрагмента, конвертируйте обратно:

converted_float = float(str(float_example)[:2])
converted_int = int(str(int_example)[:2])

print(converted_float, f"Data type: {type(converted_float)}")  # 12.0, 
print(converted_int, f"Data type: {type(converted_int)}")      # 12, 
  • Для множеств: преобразуйте в список. Учтите, что set не гарантирует порядок элементов. Если порядок важен, выполните сортировку с понятным ключом.
set_example = {1, 3, 5, "Python"}
converted = sorted(set_example, key=lambda x: (isinstance(x, str), x))
print(converted[3])  # 'Python'

Важно: sorted при смешанных типах может выкинуть TypeError в Python 3, если элементы нельзя напрямую сравнить. Ключ сортировки должен быть надёжным для вашего набора данных.

Когда преобразование не подходит — альтернативы

  • Вместо индексирования используйте итерацию: for x in obj: …
  • Для доступа к полям объектов используйте getattr(obj, ‘field’, default).
  • Если функция возвращает одиночное значение, а вы ждёте последовательность — исправьте функцию или оберните результат в список/tuple.
  • Для работы с JSON проверьте, что библиотека вернула dict/list, а не строку: json.loads возвращает структуру, json.dumps — строку.

Частые причины ошибки в реальных проектах

  • Вы ожидаете список из API, но получили None или пустую строку.
  • Функция возвращает скаляр вместо коллекции.
  • Путаница между bytes и str (bytes можно индексировать, но элементы — целые числа).
  • Ошибка в использовании pandas: Series поддерживает индексирование по меткам, но DataFrame[…] возвращает столбец/серии — будьте внимательны с типами.

Ментальные модели и эвристики

  • “Sequence vs Scalar”: если объект ведёт себя как контейнер (итерируем, len(obj) работает) — скорее всего subscriptable.
  • “Mapping vs Sequence”: словарь — доступ по ключу, список/tuple — по целочисленному индексу.
  • “Проверяй границы”: даже индексируемый объект может дать IndexError, если индекс вне диапазона.

Быстрая схема действий (SOP)

  1. Запустите print(type(obj)) и print(repr(obj)).
  2. Если это None — найдите, где он устанавливается.
  3. Если это скаляр и вам нужен элемент — преобразуйте в str или оберните в список, если это осмысленно.
  4. Если это set и важен порядок — используйте sorted с ключом или храните данные в list сразу.
  5. Добавьте тест, чтобы предотвратить регрессии.

Решение для разработчика: чек-лист перед PR

  • Проверил тип переменных через type() в проблемном месте.
  • Убедился, что API/функция возвращает ожидаемый тип.
  • Добавил конвертацию типов с явными проверками и комментариями.
  • Покрыл изменение тестом, проверяющим поведение при крайних данных.

Диаграмма принятия решения

flowchart TD
  A[Есть ошибка 'object is not subscriptable'] --> B{Что за объект?}
  B --> |None| C[Найти источник None]
  B --> |int/float/bool| D[Нужно ли индексировать?]
  D --> |Да| E[Преобразовать в str и индексировать, затем конвертировать]
  D --> |Нет| F[Изменить логику доступа]
  B --> |set| G[Преобразовать в list/sorted]
  B --> |dict/list/str/tuple| H[Проверить индекс/ключ на корректность]

Небольшой глоссарий

  • Subscriptable: объект, к которому применяют [] для доступа.
  • Sequence: упорядоченная коллекция (list, tuple, str).
  • Mapping: отображение ключ→значение (dict).

Заключение

Ошибка “object is not subscriptable” обычно легко диагностируется: посмотрите на тип объекта и выберите одно из трёх решений — преобразовать тип, изменить логику доступа или исправить источник данных. Внимание к типам и простые проверки type()/repr() существенно ускоряют отладку.

Важно: не полагайтесь на неявные преобразования в продакшн-коде. Явные конверсии и тесты предотвращают подобные ошибки.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро