Программист освоил JavaScript и начал изучать Python. Чтобы освоиться в языке, он переносит проекты с одного языка на другой — убирает точки с запятой, добавляет отступы и меняет команды одного языка на такие же команды из другого языка.
Один из фрагментов его кода после перевода в Python выглядит так:
# зарплата в месяц
month = 14200
# плата за ЖКХ
regular_cost = 5800
# функция, которая считает и возвращает долю ЖКХ в бюджете
def calculate(budget,base):
message = 'На коммунальные платежи уходит ' + base + 'р. - это ' + base/budget*100 + ' процентов от ежемесячного бюджета'
return message
# отправляем в функцию переменные и выводим результат на экран
print(calculate(month,regular_cost))
Но после запуска программист получает ошибку:
❌ TypeError: can only concatenate str (not "int") to str
Странно, но в JavaScript всё работало, почему же здесь код сломался?
Что это значит: компилятор не смог соединить строки и числа, поэтому выдал ошибку.
Когда встречается: в языках со строгой типизацией, например в Python, когда у всех переменных в выражении должен быть один и тот же тип данных. А вот в JavaScript, который изучал программист до этого, типизация нестрогая, и компилятор сам мог привести все части выражения к одному типу.
Что делать с ошибкой TypeError: can only concatenate str (not "int") to str
Раз это проблема строгой типизации, то для исправления этой ошибки нужно просто привести все части к одному типу.
В нашем случае мы хотим получить на выходе строку, поэтому все слагаемые должны быть строкового типа. Но base
и base/budget*100
— это числа, поэтому просто так их сложить со строками не получится. Чтобы выйти из ситуации, явно преобразуем их в строки командой str()
:
message = 'На коммунальные платежи уходит ' + str(base) + 'р. - это ' + str(base/budget*100) + ' процентов от ежемесячного бюджета'
Команда str()
делает так, что всё внутри неё приводится к строке и она отдаёт дальше строку. В итоге операция склейки строк проходит как ожидаемо: строка к строке даёт строку. Нет повода для беспокойства.