Python: явные imports и управляемая инициализация
Imports явно показывают происхождение имен. Группируйте stdlib, third-party и проектные пакеты; импорт модуля не должен сам выполнять бизнес-операцию.
Плохо
from json import *
import pathlib, os
result = loads(pathlib.Path("orders.json").read_text())
# Чтение файла запускается при любом import этого модуля.
Хорошо
import json
from pathlib import Path
def read_json(path: Path) -> object:
return json.loads(path.read_text(encoding="utf-8"))
Почему это важно
Wildcard скрывает источник имени и может незаметно изменить namespace. Python выполняет код модуля при загрузке; тяжелая инициализация, сеть или чтение обязательного файла на уровне модуля мешают тестам, CLI и повторному использованию. Явная функция отделяет импорт от запуска операции.
Когда применять
Для библиотек и приложений Python. Обычные imports находятся после docstring и допустимых future declarations, до констант/кода; группы разделяются пустой строкой. import os и import sys обычно отдельными строками, from module import A, B допустим. Absolute imports предпочтительны; явные relative imports внутри пакета разрешены, если сохраняют ясность.
Не используйте from module import * в обычном коде. Узкое исключение — намеренный re-export публичного API с контролем all; это не разрешение скрывать произвольные зависимости. Отложенный import внутри функции допустим для optional dependency, цикла, измеримого startup cost; причина и поведение при отсутствии зависимости должны быть понятны. Не исправляйте packaging ручным добавлением случайных путей в sys.path.
TYPE_CHECKING imports не существуют в runtime: учитывайте introspection framework и версию механизма annotations. Модуль и тесты запускаются в установленном package/предусмотренном entry point, а не только благодаря текущей рабочей директории. Пример читает JSON при вызове и возвращает object; валидация структуры выполняется отдельно.
Кто что делает
Человек
Определяет публичные re-exports и допустимую initialization policy.
AI-агент
Проверяет зависимости и import-time эффекты; не скрывает cycle случайным изменением sys.path.
Как проверить у себя
-
Импорт example module при отсутствующем orders.json → import → успешно без чтения файла/сети → isolated import test.
-
Явный вызов read_json с корректным UTF-8 JSON → операция → разобранное значение → fixture.
-
Optional dependency отсутствует или package запускается из другой cwd → предусмотренный путь → понятный отказ/неактивная функция без sys.path workaround → packaging test.
Первоисточники
История изменений на GitHubДата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.