← Все вопросы

TypeError: 'NoneType' object is not subscriptable — откуда взялся None?

Задан 2 месяца назад732 просмотров3 ответа
14

Пишу:

data = config.get("user")
name = data["name"]

и падает с TypeError: 'NoneType' object is not subscriptable. Что это вообще значит и где искать причину?

3 ответа

26
✓ Принятый ответ — помог автору

«subscriptable» = «к нему можно применить квадратные скобки [...]». Сообщение говорит, что вы пишете что_то[...], а это что_то равно None. То есть переменная, которую вы индексируете, оказалась None, а не списком/словарём/строкой.

В вашем случае config.get("user") вернул None, потому что ключа "user" в словаре нет (.get для отсутствующего ключа возвращает None, а не кидает KeyError). Дальше None["name"] и падает.

Как чинить — зависит от того, что вы ожидали:

user = config.get("user")
if user is None:
    print("нет секции user в конфиге")
else:
    name = user["name"]

или задать значение по умолчанию: config.get("user", {}) — тогда вместо None будет пустой словарь, и ["name"] уже даст осмысленный KeyError, а не загадочный NoneType.

Павел Скрипов Классика: функция без return тоже вернёт None, и потом result[0] упадёт так же. · 2 месяца назад
9

Очень частый источник — функция, которая «забыла» вернуть значение. re.match(...) при отсутствии совпадения возвращает None, и match.group(1) падает именно так. Проверяйте, что слева от скобок реально не None.

4

None — это «ничего». Скобками «ничего» не поиндексируешь.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект