Зависимости
что импортируется, откуда и какой версии
Что это
Зависимости — чужой код, который использует твой проект. Читать их важно по двум причинам: по импортам видно, чем файл занимается, а по версиям — почему код от ИИ может не запускаться.
Вторая причина — та самая причина 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.==фиксирует версию, без указания — любая, и это рискованно.Версию библиотеки называй в запросе всегда.
Половина странных ошибок в коде от ИИ — это версия.
Перед новой зависимостью спроси, можно ли без неё.