Красные флаги в сгенерированном коде
десять признаков, по которым стоит присмотреться
Что это
Итоговая статья главы: список того, что в коде от ИИ встречается чаще всего и чаще всего оказывается проблемой. Красный флаг — не приговор, а повод остановиться и прочитать внимательнее.
Все десять опираются на предыдущие статьи, поэтому читаются быстро — это сводка, а не новый материал.
На что смотреть
1. Проглоченные ошибки
try:
data = fetch_weather(city)
except Exception:
passПрограмма не падает и поэтому кажется рабочей. На деле дальше поедут неверные
данные, а причина не всплывёт нигде. Сюда же except: return None и
.get(key, {}) там, где поле обязано быть (статьи 2.8, 2.13).
2. Значения по умолчанию вместо ошибки
temp = data.get("main", {}).get("temp", 0)Ноль градусов выглядит как настоящий ответ. Если поле обязательное, его отсутствие — ошибка, а не повод подставить число.
3. Выдуманные библиотеки и методы
Импорт пакета, которого нет, или вызов метода, которого в библиотеке не существует. Код выглядит уверенно и падает при запуске. Лечится проверкой версии (статья 2.11) и беглым взглядом в документацию.
4. Блокирующий вызов в асинхронном коде
async def handler(message):
r = requests.get(url) # останавливает всёБот перестаёт отвечать всем, пока идёт один запрос (статья 2.10).
5. Секреты в коде
TOKEN = "7123456789:AAE-abcdef..."Попадёт в git и останется в истории навсегда. Токены — только из переменных окружения.
6. Код вне функций
Строка conn = sqlite3.connect(DB_PATH) на верхнем уровне файла выполнится
при импорте — не тогда, когда ты ожидаешь, и не один раз (статья 2.2).
7. Изменяемое значение по умолчанию
def add_item(item, cart=[]):Список создаётся один раз и остаётся общим для всех вызовов (статья 2.5).
8. Функция делает больше, чем просили
Внутри появились логирование, кеш, повторные попытки, валидация, о которых речи не было. Не обязательно вредно, но это код, который ты не заказывал и не проверял.
9. Молчаливое изменение того, что передали
def add_tax(items: list[dict], rate: float) -> None:
for item in items:
item["price"] = ...Снаружи данные тоже изменились. Повторный вызов начислит налог на налог (статья 2.5).
10. Комментарии вместо кода
# Здесь нужно проверить права доступа
# TODO: обработать случай с пустым списком
return resultКомментарий описывает то, чего в коде нет. Выглядит как продуманное решение, а на деле это дыра, оформленная вежливо.
Как сказать ИИ
Проверка в один запрос — после получения кода, до принятия:
Проверь свой код по списку:
- проглоченные исключения и значения по умолчанию вместо ошибок
- вызовы методов, которых может не быть в этой версии библиотеки
- блокирующие вызовы внутри async
- секреты в коде
- код вне функций
- изменяемые значения по умолчанию в аргументах
- изменение данных, переданных аргументом
Что из этого есть? Если ничего — так и скажи.Такой запрос работает лучше общего «сделай ревью»: он называет, что искать (статья 3.8).
Шпаргалка
Проглоченные ошибки:
except Exception: pass,.get()вместо проверки.Значение по умолчанию вместо ошибки — ответ, который врёт.
Выдуманные библиотеки и методы — проверяй версию и документацию.
requestsиtime.sleepвнутриasync def.Токены в коде — попадут в историю git навсегда.
Код вне функций выполняется при импорте.
=[]в аргументах, изменение переданных данных, лишняя работа.# TODOв коде — это дыра, а не решение.