Ошибки ИИ в 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 -q4. Дифф
git diff --stat && git diffРазмер, удалённые строки, границы (статья 4.7).
5. Асинхронность
Глазами: нет ли синхронных вызовов в async def, есть ли таймауты, есть ли
return_exceptions у gather.
6. Неудачный случай
Запустить на пустых данных или недоступной сети.
Шпаргалка
Специфично для Python: старый синтаксис, синхронное в async,
gatherбез защиты.=[]в аргументах и.get()вместо проверки — здесь встречаются чаще всего.Выдуманные именованные аргументы проверяй
inspect.signature.Чек-лист: запуск ·
mypy --strict· тесты · дифф · асинхронность · неудачный случай.Проверка типов — самый выгодный шаг из шести.
Объедини первые три в одну команду.