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

Зависимости

что импортируется, откуда и какой версии

Что это

Зависимости — чужой код, который использует твой проект. Читать их важно по двум причинам: по импортам видно, чем файл занимается, а по версиям — почему код от ИИ может не запускаться.

Вторая причина — та самая причина 3 из статьи 3.1, «он помнит другое». Половина необъяснимых ошибок в сгенерированном коде объясняется версией.

Как выглядит в коде

import os                          # стандартная библиотека
import sqlite3

import aiohttp                     # внешняя, из requirements
from aiogram import Bot, Router
from aiogram.filters import Command

from config import settings        # своё, из этого же проекта
from storage import add_reminder

Три группы, разделённые пустыми строками: стандартная библиотека, внешние пакеты, свой код. Это общепринятый порядок, и по нему сразу видно, что откуда.

Как отличить одно от другого

ПризнакОткуда
os, sys, json, re, datetime, pathlibстандартная библиотека, ставить не надо
есть в requirements.txtвнешний пакет
совпадает с именем файла или папки в проектесвой код

Если не уверен — посмотри в requirements.txt. Чего там нет и что не похоже на файл проекта, скорее всего, из стандартной библиотеки.

Две формы импорта

import sqlite3              # берём модуль целиком
conn = sqlite3.connect(...)

from aiogram import Bot     # берём одно имя из модуля
bot = Bot(token=...)

Разница только в том, как потом пишется обращение. Форма from ... import * — плохая: непонятно, какие имена появились в файле, и они могут перекрыть существующие.

Где написаны версии

измерено
aiogram==3.13.1
aiohttp>=3.9,<4.0
python-dotenv
  • ==3.13.1 — ровно эта версия.
  • >=3.9,<4.0 — любая из этого диапазона.
  • без указания — любая, в том числе вышедшая завтра и несовместимая.

Последний случай — источник ошибок вида «вчера работало». Поэтому в рабочих проектах версии фиксируют.

Узнать, что установлено на самом деле:

pip freeze | grep aiogram

Почему версия решает так много

Между мажорными версиями библиотеки ломают совместимость. Примеры, которые встретятся чаще всего:

БиблиотекаЧто поменялось
aiogram 2 → 3другой способ регистрации хендлеров, другие импорты
pydantic 1 → 2другие имена методов, другая валидация
React (классы → хуки)совсем другой способ писать компоненты
Flutterменяет API между мажорными версиями

Кода для старых версий в интернете больше, поэтому ИИ по умолчанию тянется к нему.

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

Запрос
Вот мой requirements.txt. Пиши код только под эти версии.

aiogram==3.13.1
aiohttp==3.9.5

Когда код не запускается:

Запрос
Код не работает: ImportError: cannot import name 'Dispatcher'
from 'aiogram'. У меня aiogram 3.13.1. Под какую версию
написан этот код и как переписать под мою?

Перед добавлением новой библиотеки:

Запрос
Можно ли решить это стандартной библиотекой, без новой
зависимости? Если нет — объясни, почему.

Последний вопрос стоит задавать всегда. Каждая зависимость — это то, что надо обновлять, что может сломаться и что увеличивает проект.

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

Импорт, которого нет в requirements.txt. Код не запустится у тебя, даже если у ИИ «работает». Проверяется мгновенно: попробовать запустить.

Выдуманная библиотека. ИИ иногда импортирует пакеты, которых не существует, или методы, которых в пакете нет. Проверка — pip index versions имя или просто поиск в документации (статья 4.8).

Новая зависимость ради одной функции. Целый пакет, чтобы отформатировать дату, — почти всегда лишнее.

Импорт внутри функции. Иногда оправдан (медленная библиотека, круговые импорты), но чаще это след от правок. Заметил — спроси, зачем так.

Разъехавшиеся версии. В requirements.txt одно, pip freeze показывает другое. Значит, окружение собрано не из этого файла, и у тебя с сервером может быть по-разному.

Шпаргалка

  • Три группы импортов: стандартные · внешние · свои.

  • Не уверен, откуда — смотри requirements.txt.

  • == фиксирует версию, без указания — любая, и это рискованно.

  • Версию библиотеки называй в запросе всегда.

  • Половина странных ошибок в коде от ИИ — это версия.

  • Перед новой зависимостью спроси, можно ли без неё.