TypeError: 'NoneType' object is not subscriptable — откуда взялся None?
Пишу:
data = config.get("user")
name = data["name"]
и падает с TypeError: 'NoneType' object is not subscriptable. Что это вообще значит и где искать причину?
3 ответа
«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.
Очень частый источник — функция, которая «забыла» вернуть значение. re.match(...) при отсутствии совпадения возвращает None, и match.group(1) падает именно так. Проверяйте, что слева от скобок реально не None.
None — это «ничего». Скобками «ничего» не поиндексируешь.