Что означает ошибка 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
Играем в двадцать одно на компьютере
Играем в двадцать одно на компьютере

Свой проект с блек-джеком и JavaScript

hard
Конец ретроградному Меркурию! Пишем собственный гороскоп на Python
Конец ретроградному Меркурию! Пишем собственный гороскоп на Python

Наш гороскоп точен и прост! Сбросим иго астрологов!

medium
Делаем свой кредитный калькулятор на Python
Делаем свой кредитный калькулятор на Python

Простой, но полезный

easy
Как защитить сайт от хулиганских скриптов
Как защитить сайт от хулиганских скриптов

Приключение на 5 минут.

easy
Веб-проект: часы столетия с потрясающей анимацией
Веб-проект: часы столетия с потрясающей анимацией

Создаём универсальные часы с точностью от секунды до года

hard
Matplotlib: полное руководство по визуализации данных
Matplotlib: полное руководство по визуализации данных

Разбираем построение графиков с примерами

hard
easy