Python LinuxWindowsmacOS

Python: AttributeError: 'NoneType' object has no attribute

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Переменная равна None, потому что функция ничего не вернула или поиск не нашёл результат. Проверяйте значение перед обращением.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Типичные источники None
  5. Как отлаживать
  6. Безопасные шаблоны

#Что означает ошибка

Сообщение
NoneType has no attribute

Ошибка AttributeError: 'NoneType' object has no attribute '...' значит, что вы обращаетесь к атрибуту или методу у объекта None. Функция вернула None вместо ожидаемого значения: например, re.match не нашёл совпадения, dict.get не нашёл ключ, метод изменил список «на месте» и вернул None.

В трассировке (traceback) всегда указана строка. Определите, какая переменная оказалась None, и почему.

Исправление — либо обеспечить, чтобы значение не было None, либо проверять его перед использованием.

Переменная равна None, потому что функция ничего не вернула или поиск не нашёл результат. Проверяйте значение перед обращением.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Функция без returnNone.Функция заканчивается без return в одной веткеУбедитесь, что ожидаемый объект возвращается при успешном исходе.
Пустой результатre/поиск.Метод поиска, например re.search, не нашёл совпаденияПроверьте None и верните понятную ошибку или безопасный результат.
Метод меняет на местеsort/append.Код присвоил результат list.sort() или list.append()Не присваивайте возвращаемое None; метод меняет список на месте.
Не найден элементПарсер.Поиск в словаре/HTML/БД не нашёл записьОбработайте отсутствие данных до обращения к атрибуту.

#Пошаговое решение

  1. Найдите строку в tracebackВ терминале VS Code («Терминал» → «Новый терминал») или обычном терминале откройте проект и запустите скрипт той командой, которой ошибка воспроизводится. Прочитайте traceback снизу вверх: последняя строка содержит AttributeError: 'NoneType' object has no attribute '...', а ближайший фрагмент стека вашего проекта укажет файл и номер строки, где пытаются взять атрибут у None. Откройте этот файл по указанной строке; не исправляйте код библиотеки, если проблема в переданных ей данных.
  2. Выведите значениеПеред ошибочной строкой в локальной разработке временно добавьте, например, print('user=', repr(user), 'type=', type(user).__name__), подставив имя переменной из своего кода; не выводите токены, пароли и персональные данные в общий журнал. Запустите сценарий повторно. Если увидели None/NoneType, значит объект не создан или не найден. После проверки удалите отладочный вывод. Если значение меняется между запросами, воспроизведите конкретный входной случай и приложите стек без секретов.
  3. Найдите, где вернулось NoneПроследите место, где переменная присваивается: например, user = find_user(id). Откройте функцию find_user (переход к определению в редакторе) и проверьте все ветки: есть ли return с объектом, не возвращается ли None при пустом поиске, не забыта ли обработка исключения. Методы list.sort() и list.append() изменяют список на месте и возвращают None; не присваивайте их результат вместо списка. Убедитесь, что ваша функция возвращает ожидаемый объект при тестовом входе.
  4. Добавьте проверкуЕсли отсутствие объекта — допустимая ситуация, добавьте явную ветку до обращения к атрибуту: if user is None: raise ValueError('Пользователь не найден') для внутреннего кода или верните понятный ответ в обработчике запроса. Если отсутствие допустимо и ничего делать не нужно, используйте if user is not None: .... Не применяйте getattr(user, 'name', '') как универсальную маскировку: это скрывает ошибку в источнике значения.
  5. Исправьте источникДобавьте тесты для случая «объект найден» и «объект отсутствует», затем повторите реальный сценарий. Если ошибка больше не появляется, проверьте поведение интерфейса при отсутствии записи (например, сообщение «не найдено», а не пустой экран). Если ошибка остаётся, сохраните полный traceback и значение type(...) без секретов: возможно, None возникает позже в другой ветке кода.

#Типичные источники None

re.match(...) и re.search(...) возвращают None, если нет совпадения. list.sort(), list.append(), random.shuffle() изменяют объект и возвращают None: запись a = a.sort() обнуляет переменную. Функция без return возвращает None. dict.get(ключ) возвращает None при отсутствии ключа. BeautifulSoup.find(...) возвращает None, если тег не найден.

#Как отлаживать

Добавьте перед проблемной строкой print(repr(переменная)) или используйте breakpoint(). Проверьте тип: print(type(x)). В IDE (PyCharm, VS Code) поставьте точку останова и посмотрите значения в стеке вызовов. Для функций, которые должны возвращать значение, добавьте проверку и осмысленное исключение.

#Безопасные шаблоны

Проверка перед использованием: if m is not None: m.group(1). Значение по умолчанию: data.get("key", ""). Для цепочек — условное выражение x.attr if x else None. Типы (Optional[str]) и mypy помогают найти такие места до запуска: pip install mypy, затем mypy файл.py.

PythonКоманда
Пример безопасной работы с результатом re.search.
m = re.search(r"\d+", text)
value = m.group(0) if m else None

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.