Что означает ошибка Exception has occurred: TypeError

Неочевидная ошибка в типах данных Python.

Что означает ошибка Exception has occurred: TypeError

Ситуация: начинающий программист более-менее освоил JavaScript и перешёл к Python. Чтобы освоить новый язык на практике, программист решил переписать свой старый проект с JavaScript на Python и столкнулся с таким фрагментом:

var a = 2;
var b = ' ствола';
var c = a + b;

Программист помнит, что в Python для переменных не нужен var, а можно просто объявлять их в нужном месте, поэтому он написал такой код:

a = 2
b = ‘ ствола’
c = a + b

Но при запуске проекта компьютер указал на последнюю строку и выдал ошибку:

Exception has occurred: TypeError
unsupported operand type(s) for +: ‘int’ and ‘str’

Почему так происходит: в JavaScript есть автоматическое приведение типов, и компьютер берёт на себя перевод данных из одного типа в другой. В нашем примере он сделает так:

  1. Возьмёт число и строку.
  2. Увидит, что их нужно сложить.
  3. Посмотрит по своим правилам, к какому одному типу проще всего привести всё в этой ситуации. 
  4. Поймёт, что проще перевести число в строку, чем наоборот.
  5. Сделает так и на выходе получит строку «2 ствола»

Но Python так не умеет — ему нужно, чтобы данные были одного типа или хотя бы из одного семейства: оба числовые, оба строковые и так далее. Так как сейчас идёт сложение разных типов данных, то Питон говорит, что он так делать не будет, и падает с ошибкой.

Что делать с ошибкой Exception has occurred: TypeError

Чтобы исправить эту ошибку, нужно вручную привести данные к одному типу или явно указать их при операции.

В нашем случае можно сделать так: при сложении сказать компьютеру напрямую, что мы хотим в сложении использовать переменную a как строку:

a = 2
b = ‘ ствола’
c = str(a) + b

Команда str() не меняет тип и содержимое переменной a, но зато компьютер понимает, что это временно стало строкой, и спокойно её складывает со второй строкой.

Редактура:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Олег Вешкурцев

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
Uncaught SyntaxError: Unexpected token — что это означает?
Uncaught SyntaxError: Unexpected token — что это означает?

Самая популярная ошибка у новичков.

medium
Uncaught SyntaxError: Unexpected end of input — что это значит?
Uncaught SyntaxError: Unexpected end of input — что это значит?

Скорее всего, вы забыли закрыть скобки при объявлении функции.

easy
ReferenceError: math is not defined — что это означает
ReferenceError: math is not defined — что это означает

Противная и неочевидная ошибка, которую очень легко исправить.

medium
WebDAV: что это, как настроить и использовать протокол
WebDAV: что это, как настроить и использовать протокол

Делаем удалённую файловую систему сами

hard
Правильные цитаты: добавляем первоисточник в ворованный с вашего сайта контент
Правильные цитаты: добавляем первоисточник в ворованный с вашего сайта контент

При вставке все будут видеть, откуда скопирован текст

medium
Что означает ошибка TypeError: unsupported operand type(s)
Что означает ошибка TypeError: unsupported operand type(s)

Коварная ошибка с типами данных в Python

easy
Как сделать колесо фортуны на сайте
Как сделать колесо фортуны на сайте

Достаточно одного скрипта и немного CSS

medium
Как добавить кнопки «Поделиться» на страницу
Как добавить кнопки «Поделиться» на страницу

Простой рецепт от Яндекса.

easy
Делаем свой планировщик задач
Делаем свой планировщик задач

Bootstrap + TodoList = Trello

hard
easy