Ошибка TypeError: can only concatenate str (not "int") to str в Python возникает, когда ты пытаешься сложить строку и число через +. Python не складывает разные типы неявно — и это не каприз, а защита от скрытых багов. Разберём, почему так, и как правильно объединить текст с числом.
Коротко
Нельзя писать "Тебе " + age, если age — число. Правильно — f-строка: f"Тебе {age} лет". Она сама подставит число в текст. Второй вариант — вручную превратить число в строку: "Тебе " + str(age) + " лет".
Почему возникает ошибка
Оператор + в Python значит разное для разных типов: для строк это склейка ("a" + "b" → "ab"), для чисел — сложение (2 + 3 → 5). Когда слева строка, а справа число, Python не знает, что ты имел в виду, и не угадывает — вместо этого честно сообщает об ошибке. В отличие от JavaScript, который молча склеил бы всё в строку и часто давал бы неожиданный результат.
age = 25
print("Тебе " + age + " лет")Текст ошибки читается прямо: «можно склеивать только строку со строкой, а не с int». Проблема — в + age, где age число. Про типы данных и почему Python строг к ним — в гайде Типы данных в Python: полный гайд для начинающих.
Как исправить: f-строка
Лучший способ вставить число в текст — f-строка. Никаких + и преобразований: значение подставляется прямо в фигурные скобки.
age = 25
print(f"Тебе {age} лет")Тебе 25 лет
Если по какой-то причине f-строка не подходит, число можно превратить в строку явно через str(): "Тебе " + str(age) + " лет". Но f-строка короче и читаемее — подробнее в гайде f-строки в Python: форматирование строк просто и читаемо.
Где та же ошибка встретится снова
Чаще всего эта ошибка вылезает в трёх местах: при сборке сообщения в print, при склейке результата с числом и — особенно — при работе с input(). Помни, что input() всегда возвращает строку: пиши int(input(...)), если планируешь считать. Обратная ситуация — сложить число со строкой из ввода — даст ту же TypeError.
Когда str(), а когда f-строка
Для вставки значений в текст почти всегда лучше f-строка — она читаемее и не захламляет код вызовами str(). Явный str(x) оправдан, когда нужно именно преобразование числа в строку как отдельный шаг (например, перед join() списка чисел). Смешивать текст и числа через + не стоит вообще.
Короткие ответы на вопросы
Что значит can only concatenate str (not int) to str?
Что оператор + со строкой ждёт справа тоже строку, а получил число (int). Python не приводит типы автоматически, поэтому склейка строки и числа через + невозможна.
Как вывести число внутри текста?
Через f-строку: f"Всего {count} штук". Число подставится в текст автоматически, без + и без str().
Почему в JavaScript так можно, а в Python нет?
JavaScript неявно приводит типы и склеивает всё в строку, что часто прячет ошибки. Python выбрал строгость: лучше явная ошибка сейчас, чем непонятный результат позже.
Кот-наставник— Запомни:
+не дружит с разными типами. Строка со строкой — склейка, число с числом — сумма, а вместе —TypeError.— Хочешь текст с числом? Бери f-строку:
f"..{значение}..". Это и короче, и без сюрпризов.
Ошибки типов понятнее на практике
На SkillPy ты пишешь код сам, а AI-наставник ловит TypeError в безопасной среде и показывает, где строка встретилась с числом. Он понимает твоё решение, а не сверяет с шаблоном.
