#Что означает ошибка
unsupported operand type
TypeError: unsupported operand type(s) for +: 'int' and 'str' значит, что операция применена к несовместимым типам. Python не приводит типы автоматически: нельзя сложить число и строку, сравнить None с числом или умножить список на дробь.
В сообщении указаны оператор и оба типа — это ключ к решению.
Определите источник значения неправильного типа.
Складываются значения несовместимых типов. Приведите типы через int(), str() или используйте f-строки.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Число и строкаinput. | Числовое значение получено из формы или input как str | Проверьте ввод, затем int/float для арифметики. |
| None в выраженииПустое. | Код ожидает склеивание текста, но получает int | Используйте str() или f-строку. |
| Список и числоТипы. | Одна ветка изменила тип значения | Включите проверку типов и тесты входных данных. |
| Данные из файлаСтроки. | Значение неожиданно None — отдельный тип ошибки | Проверьте return и методы, изменяющие объект на месте. |
#Пошаговое решение
- Прочитайте типы в сообщенииНайдите в последней строке traceback типы операндов, например
unsupported operand type(s) for +: 'int' and 'str'. В редакторе откройте строку из стека и выделите обе стороны оператора+. Дляint + strPython не может догадаться, требуется ли математическое сложение или склеивание текста. Если сообщение содержит другую пару типов, выясните правила именно этих типов, не применяйте преобразование из примера вслепую. - Выведите значения и типыВ своём отладочном окружении перед выражением добавьте
print(repr(left), type(left), repr(right), type(right)), подставив имена настоящих переменных; затем запустите скрипт с теми же входными данными. Запишите значения и типы, избегая вывода паролей и персональных сведений. Если строка пришла изinput(), формы или CSV, это объясняет, почему число записано какstr. Уберите отладочный вывод после проверки. - Найдите источник NoneЕсли в сообщении об ошибке фигурирует
NoneType, это отдельный сценарий, а не причина именно дляint + str. Проверьте, не присвоили ли переменной результат функции безreturnили метода, возвращающегоNone(list.sort,list.append). Прочитайте сигнатуру функции, исправьте источник значения и добавьте тест. Если оба операнда действительно int и str, этот шаг пропустите — искатьNoneне требуется. - Приведите типы явноВыберите действие по смыслу. Для арифметики преобразуйте проверенную строку:
total = count + int(text)(строка должна состоять из целого числа; возможенValueError). Для текста используйтеmessage = str(count) + textлибоf'{count}{text}'. Если данные могут содержать пустоту, пробелы или разделители, сначала проверьте формат и обработайте исключение, не заменяйте все ошибки на ноль автоматически. Повторите проблемное действие на нескольких входах. - Подключите mypyЕсли ошибка повторяется в большом проекте, используйте аннотации и статический анализ: в виртуальном окружении проекта выполните
python -m pip install mypy, затемpython -m mypy путь/к/модулю.py, заменив путь своим. Перед установкой проверьте политику зависимостей проекта; mypy может не обнаружить проблему, если значения имеют типAny. Добавьте автоматические тесты для пустого, числового и строкового ввода, чтобы несовместимые типы не возвращались после правок.
#Чтение сообщения
Фрагмент for +: 'int' and 'NoneType' означает, что одно значение равно None — чаще всего функция ничего не вернула (забыт return) или метод изменяет объект на месте (list.sort() возвращает None). Выведите типы: print(type(a), type(b), a, b). Используйте отладчик или breakpoint() перед строкой с ошибкой.
#Типичные причины
input() возвращает строку: age = int(input()). Данные из CSV/JSON/HTML приходят строками, числа нужно преобразовать int()/float(). Конкатенация строки и числа: используйте f-строки f"Итого: {total}". Значение None из dict.get() или функции без return: задайте значение по умолчанию d.get("x", 0). Сравнение str и int в условиях.
#Профилактика
Добавьте аннотации типов и запустите mypy или Pyright: они находят такие ошибки до запуска. Проверяйте вход функций (isinstance). Используйте Decimal для денег. При разборе пользовательских данных оборачивайте приведение типов в try/except ValueError. Для pandas приведите столбцы: df["price"] = pd.to_numeric(df["price"], errors="coerce").
a, b = 5, input("Число: ")print(type(a), type(b))total = a + int(b)print(f"Итого: {total}")