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

Ошибки ИИ в Python и чек-лист

чем этот стек отличается от остальных

Что это

Завершение главы: что ИИ путает именно в Python и как проверить питоновский код за несколько минут.

Общие красные флаги — в статье 2.14, они действуют и здесь. В этой статье только то, что специфично для языка.

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

1. Код для старой версии языка

Optional[str] и List[str] вместо str | None и list[str], os.path вместо pathlib, %-форматирование вместо f-строк. Работать будет, выглядеть будет устаревшим. Хуже, когда наоборот: современный синтаксис на старом Python — тогда падает при импорте.

2. Синхронное в асинхронном

requests вместо aiohttp, sqlite3 вместо aiosqlite, time.sleep вместо asyncio.sleep. Самая частая ошибка в коде для ботов: код работает, но бот перестаёт отвечать всем на время каждого запроса (статьи 2.10, 6.4).

3. gather без return_exceptions

Разобрана в статье 6.4. Проверяется одним взглядом и ломается на первом сбое внешнего сервиса.

4. Изменяемое значение по умолчанию

def add_item(item, cart=[]):

Список создаётся один раз на всю программу (статья 2.5). ИИ воспроизводит эту ошибку регулярно, потому что в обучающих данных её много.

5. Проглоченные исключения

except Exception: pass, .get(key, {}) вместо проверки, return None там, где нужна ошибка. Разобрано в статьях 2.8 и 2.14 — в Python встречается чаще всего из-за удобства .get().

6. Выдуманные параметры функций

Самый тихий вид галлюцинаций (статья 4.8): несуществующий именованный аргумент иногда просто игнорируется. Проверяется одной командой:

python3 -c "import inspect, aiohttp; print(inspect.signature(aiohttp.ClientSession.get))"

7. Код вне функций

Выполняется при импорте — подключение к базе, чтение файла, запрос к API на верхнем уровне модуля (статья 2.2). В Python это особенно коварно, потому что модуль импортируется один раз и ошибка проявляется не сразу.

8. print вместо logging

В скрипте допустимо, в боте или сервисе — нет: вывод исчезает вместе с терминалом (статья 4.2).

Как сказать ИИ

Проверка одним запросом:

Запрос
Проверь свой код по списку, специфичному для Python:
- синтаксис под Python 3.12, не старее
- нет синхронных вызовов внутри async (requests, time.sleep, sqlite3)
- gather, если есть, с return_exceptions=True
- нет изменяемых значений по умолчанию в аргументах
- нет except Exception: pass и .get() вместо проверки
- нет кода вне функций на верхнем уровне
- логирование через logging, не print

Что из этого есть? Если ничего — так и скажи.

Чек-лист питоновского кода

Шесть шагов, минуты три. Порядок — по убыванию отдачи.

1. Запускается ли

python3 -m weatherbot

Ловит выдуманные импорты, опечатки, синтаксис не той версии.

2. Проходит ли проверка типов

python3 -m mypy --strict weatherbot/

Ловит забытые проверки на None, перепутанные типы, несуществующие методы (статья 6.3). Самая выгодная из шести.

3. Проходят ли тесты

pytest -q

4. Дифф

git diff --stat && git diff

Размер, удалённые строки, границы (статья 4.7).

5. Асинхронность

Глазами: нет ли синхронных вызовов в async def, есть ли таймауты, есть ли return_exceptions у gather.

6. Неудачный случай

Запустить на пустых данных или недоступной сети.

Шпаргалка

  • Специфично для Python: старый синтаксис, синхронное в async, gather без защиты.

  • =[] в аргументах и .get() вместо проверки — здесь встречаются чаще всего.

  • Выдуманные именованные аргументы проверяй inspect.signature.

  • Чек-лист: запуск · mypy --strict · тесты · дифф · асинхронность · неудачный случай.

  • Проверка типов — самый выгодный шаг из шести.

  • Объедини первые три в одну команду.