Программирование с ИИ
ENRU
2.14

Красные флаги в сгенерированном коде

десять признаков, по которым стоит присмотреться

Что это

Итоговая статья главы: список того, что в коде от ИИ встречается чаще всего и чаще всего оказывается проблемой. Красный флаг — не приговор, а повод остановиться и прочитать внимательнее.

Все десять опираются на предыдущие статьи, поэтому читаются быстро — это сводка, а не новый материал.

На что смотреть

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 в коде — это дыра, а не решение.