Что означает ошибка 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, но зато ком­пью­тер пони­ма­ет, что это вре­мен­но ста­ло стро­кой, и спо­кой­но её скла­ды­ва­ет со вто­рой строкой.

Текст:

Миха­ил Полянин

Редак­ту­ра:

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

Худож­ник:

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

Кор­рек­тор:

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

Вёрст­ка:

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

Соц­се­ти:

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