В этой статье
Для отладки с ChatGPT нужен небольшой фрагмент, который воспроизводит сбой, и точное описание ожидаемого поведения. Разберём TypeError: функция должна сложить длительности двух записей и вернуть число 55, но пытается прибавить строку к числу.
Код, на котором видна причина
def total_minutes(rows):
return sum(row["minutes"] for row in rows)
rows = [
{"title": "Встреча", "minutes": "25"},
{"title": "Дорога", "minutes": "30"},
]
print(total_minutes(rows))
По контракту rows — список словарей с полем minutes. Каждое значение этого поля — строка с неотрицательным целым числом. Пустой список должен давать 0; ошибочную строку нельзя молча превращать в ноль.
В Python 3.13.0 исходный код завершается так:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
При чтении traceback начните с последней строки: она называет исключение и объясняет сбой. Затем поднимайтесь по строкам вызовов до операции в своём коде. В этом примере она находится внутри sum. Синтаксически правильный код может завершиться исключением во время выполнения — это разные этапы проверки программы. Устройство traceback разобрано в документации Python об ошибках и исключениях.
sum начинает накопление с числа 0. Первый элемент генератора — строка "25", поэтому первая операция фактически выглядит как 0 + "25". Число внутри строки не становится числом Python само по себе. Здесь проблема в типе данных, поступающих в суммирование.
Что передать ChatGPT
Запрос должен задавать не только падающий код, но и правила, по которым исправление будет считаться верным. Для примера выше можно скопировать такой текст:
Помоги отладить код на Python 3.13.0.
def total_minutes(rows):
return sum(row["minutes"] for row in rows)
rows = [
{"title": "Встреча", "minutes": "25"},
{"title": "Дорога", "minutes": "30"},
]
print(total_minutes(rows))
Фактическая ошибка:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Ожидаю целое число 55.
Контракт: rows — список словарей с обязательным полем minutes.
Значение minutes — строка с неотрицательным целым числом.
Пустой список должен возвращать 0. Ошибочные строки нельзя
молча заменять нулём.
Сначала объясни причину и укажи операцию, которая падает.
Затем предложи точечную правку без изменения контракта.
Покажи проверки для исходных данных, пустого списка,
значений "0" и "12", а отдельно — для недопустимой строки "25.5".
Укажи, какие ограничения входа исправление проверяет,
а какие по-прежнему должны обеспечиваться до вызова функции.
Для своего проекта добавьте полный traceback и оставьте только код, необходимый для воспроизведения сбоя. Удалите ключи и токены, замените персональные данные вымышленными. Важно сохранить типы и структуру входа: если заменить "25" на 25, ошибка из примера исчезнет ещё до отладки.
Подробнее о такой постановке задачи — в разборе запроса с исходными данными и ожидаемым результатом. Конкретная задача, достаточный контекст и уточнение запроса после проверки ответа соответствуют рекомендациям OpenAI по работе с промптами.
Точечная правка и её границы
Для оговорённого входа достаточно преобразовать строку в int перед суммированием:
def total_minutes(rows):
return sum(int(row["minutes"]) for row in rows)
Теперь sum получает числа 25 и 30. Результат — целое число 55.
Неотрицательность остаётся предусловием: int("-1") вернёт -1, поэтому эта правка сама по себе не проверяет весь контракт. Если данные приходят извне без такой гарантии, перед суммированием нужна отдельная проверка диапазона.
В другом коде тот же TypeError может иметь другую причину. Сначала найдите несовместимые операнды и выясните, какие типы должна принимать операция. Если длительность допускает дробные значения, определите формат хранения и правила округления. Для пустой строки и отсутствующего поля решите, нужно ли отклонять запись или обрабатывать её отдельно. Подставлять int() во все похожие ошибки бессмысленно.
Как проверить исправление
Запустите проверки с исправленной функцией:
assert total_minutes([
{"minutes": "25"},
{"minutes": "30"},
]) == 55
assert total_minutes([]) == 0
assert total_minutes([{"minutes": "0"}, {"minutes": "12"}]) == 12
Все три проверки проходят: исходные записи дают 55, пустой список — 0, а записи с нулевой и двенадцатиминутной длительностью — 12.
Недопустимый ввод проверьте отдельным вызовом:
total_minutes([{"minutes": "25.5"}])
Он завершается ValueError: строка с дробным значением не подходит для преобразования в int. Ошибка остаётся видимой вызывающему коду. Если же обернуть исходную функцию в try/except TypeError и возвращать 0, две записи общей длительностью 55 минут превратятся в нулевую сумму. Исключения больше нет, но расчёт сломан.
Если предложенная ChatGPT правка не прошла проверку, верните в диалог конкретный вход, новый traceback или неверный результат и ожидаемое поведение. По ним можно уточнить причину, не меняя остальную программу вслепую.
Обычный текстовый запрос из этого примера доступен в бесплатном ChatGPT с ограничениями использования. Если вы уже решили пользоваться платным тарифом, в Amber Market можно выбрать месячную подписку ChatGPT.
Источники
- Prompt engineering best practices for ChatGPTOpenAI
- ChatGPT Free Tier FAQOpenAI
- Errors and ExceptionsPython documentation